2016-04-26 48 views
2

我有两个对象列表。 PersonPurchaseOrderJava 8:通过编号合并两个对象列表

Person有姓名,年龄,身份证等
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

我看你找到了答案,但我只是好奇的东西。你在计算平均值是什么?金额数量的总和肯定是平均值,但每个金额的平均值是多少?你不想要像每个人的平均金额? –

+0

我刚刚尝试了Java 8,并且被困在如何合并两个列表中。 – sophie

回答

2

我将创建一组人物ID谁是< 18然后计算他们的购买平均:

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 –