簡體   English   中英

Java 8:按 id 合並兩個對象列表

[英]Java 8: Merge two list of objects by id

我有兩個對象列表。 PersonPurchaseOrder

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM