2017-09-13 12 views
1

>フィールドをパッキング設定 < を持って運送状オブジェクトがあり、パッキングオブジェクトは、PRICEフィールドがあります。 リスト < ウェイビル>を取得しました。 総額の合計を計算する必要があります。全部の梱包リスト < ウェイビル> Streamをどのように活用することができますか? ありがとうございます。オブジェクトフィールドとしてリストする - Stream(Java 8)経由で処理する方法?

class Waybill { 
    Set<Packing> setOfPacking; 
} 

class Packing { 
    int PRICE; 
} 

List<Waybill> allWaybills = ... 
+0

明確にするために、「ストリーム」で、あなたはJavaのストリームAPIを参照していますあなたはデシリアライズしなければなりません? – Dai

+0

@Daiはい、私はjava.io.Streamを意味します。 – Denis

+0

@Denis - 私はあなたが 'java.util.stream.Stream ' – AjahnCharles

答えて

0
import java.util.stream.* 

List<Waybill> allWaybills = ... 
int totalCost = allWaybills 
    .stream() 
    .mapToInt(w -> w.setOfPacking 
     .stream() 
     .mapToInt(p -> p.PRICE) 
     .sum() 
    ) 
    .sum(); 
+2

を意味すると思います。これを 'flatMapToInt()'で最適化できると思います和)。 – AjahnCharles

3

これが私の仕事:

double total = allWaybills.stream() 
    .flatMap(waybill -> waybill.setOfPacking.stream()) 
    .mapToInt(packing -> packing.PRICE) 
    .sum(); 

を私は任意のマルチレベルストリーム操作がないので、について推論する方が簡単だと思います。

flatMapToIntを使用して、フラットマップとマップ操作を複数のレベルにすることなく1つの操作で置き換える方法を知りたいと思います。ここで

はテストプログラムです: - .NETのLINQのののJava同等の、またはあなたが実際 `java.io.を意味しています

import java.util.Set; 
import java.util.List; 
import java.util.HashSet; 
import java.util.ArrayList; 
import java.util.stream.Collectors; 

public class HelloWorld 
{ 
    public static class Packing 
    { 
     public int PRICE = 0; 
    } 

    public static class Waybill 
    { 
     public Set<Packing> setOfPacking = new HashSet<Packing>(); 
    } 

    public static void main(String []args){ 
     List<Waybill> allWaybills = new ArrayList<Waybill>(); 

     Waybill w1 = new Waybill(); 
     Packing p1 = new Packing(); p1.PRICE = 1; w1.setOfPacking.add(p1); 
     Packing p2 = new Packing(); p2.PRICE = 2; w1.setOfPacking.add(p2); 
     allWaybills.add(w1); 

     Waybill w2 = new Waybill(); 
     Packing p3 = new Packing(); p3.PRICE = 3; w2.setOfPacking.add(p3); 
     Packing p4 = new Packing(); p4.PRICE = 4; w2.setOfPacking.add(p4); 
     allWaybills.add(w2); 

     double total = allWaybills.stream() 
      .flatMap(waybill -> waybill.setOfPacking.stream()) 
      .mapToInt(packing -> packing.PRICE) 
      .sum(); 

     System.out.println("total = "+total); 
    } 
} 
+0

ありがとうございました!しかし、私に教えてください。違いは何ですか?より良いflatMap()ですか? – Denis

+0

@Denisネストされていないので理解しやすいと思う。おそらくJVMの観点からはまったく同じです。どちらが理解しやすいと思いますか? –

+0

私は両者とも理解しています)興味深い実装は異なっていますので、すばやく反応してくれてありがとう! – Denis

関連する問題