[英]Java 8: Merge two list of objects by id
我有两个对象列表。 Person
和PurchaseOrder
。
Person
有姓名、年龄、身份证等。
PurchaseOrder
有一个personId(FK Person 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();
我会创建一组小于 18 的 Person 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();
我会先拿一套超过 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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.