2016-04-26 11 views
2

私はオブジェクトの2つのリストを持っています。 PersonおよびPurchaseOrderJava 8:IDでオブジェクトの2つのリストをマージ

Person

には、名前、年齢、IDなど
PurchaseOrderを持っていPERSONID(FK人物ID)、タイムスタンプ、量、など私が購入の平均を得るのですかJavaの8使用

、ご注文金額< 18歳ですか?

List<Person> personList = Arrays.asList(person); 
List<PurchaseOrder> purchaseOrderList = Arrays.asList(purchaseOrders); 

List<Person> underAgePerson = personList.stream() 
     .filter(p -> p.getAge < 18) 
     .collect(Collectors.toList()); 

// TODO: 
purchaseOrderList.stream() 
     .forEach(o1 -> underAgePerson.stream() 
       .filter(o2 -> o1.getPersonId() == o2.getId())); 

purchaseOrderList.stream().mapToDouble(o2 -> Long.valueOf(o2.getAmount())).average(); 
+0

を。あなたは平均して何を計算していますか?金額の合計は金額の平均ですが、金額の平均は? 1人あたりの平均金額のようなものは欲しくないですか? –

+0

私は今、Java 8を試していましたが、2つのリストをマージする方法に悩まされました。 – sophie

答えて

2

私は、彼らの購入の平均計算< 18ある人のIDのセットを作成します。私はあなたが答えを見つけたが、私は何かについてちょうど興味があった参照

List<Person> persons = Arrays.asList(
    new Person(1, 18), //(id, age) 
    new Person(2, 24), 
    new Person(3, 14), 
    new Person(4, 10) 
); 

//Same person can place multiple purchases. 
List<PurchaseOrder> purchaseOrders = Arrays.asList(
    new PurchaseOrder(1, 24), //(person id, purchase amount) 
    new PurchaseOrder(1, 40), 
    new PurchaseOrder(2, 10), 
    new PurchaseOrder(2, 24), 
    new PurchaseOrder(3, 23), 
    new PurchaseOrder(3, 45), 
    new PurchaseOrder(4, 68), 
    new PurchaseOrder(4, 12), 
    new PurchaseOrder(4, 23) 
); 

Set<Integer> personIds = persons 
    .stream() 
    .filter(person -> person.getAge() < 18) 
    .map(Person::getId) 
    .collect(Collectors.toSet()); 

OptionalDouble average = purchaseOrders 
    .stream() 
    .filter(purchaseOrder -> personIds.contains(purchaseOrder.getPersonId())) 
    .mapToInt(PurchaseOrder::getAmount) 
    .average(); 
0

最初に18以上のセットを取ります。

Set<String> over18 = personList.stream() 
           .filter(p -> p.getAge < 18) 
           .map(Person::getId) 
           .collect(Collectors.toSet()); 
List<PurchaseOrder> over18orders = purchaseOrderList.stream() 
              .filter(o -> over18.contains(o.getId()) 
              .collect(Collectors.toList()); 
double sum = over18Orders.stream().mapToDouble(o -> o.getValue()).sum(); 
double average = sum/over18.size(); // average per person. 
+1

'toSet'と' toList'は本当に存在しますか?それとも 'collect(Collectors.toList())'の省略形ですか? –

+1

これは、18歳未満ではなく、18歳未満の子供に設定する必要があります。疑問があります。over18.contains(o.getId()) 'はどのように働いていますか? –

+0

@DanielKaplan 'toArray'は私が考えていたものです。 + 1 –

関連する問題