第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java Streams - 按兩個條件匯總結果分組

Java Streams - 按兩個條件匯總結果分組

縹緲止盈 2023-06-04 15:23:14
我有一個訂單列表,我應該按兩個標準進行分組。Order_Id| Customer |    Date    | Amount |   1    | "Sam"    | 2019-03-21 | 100    |   2    | "Nick"   | 2019-03-21 | 102    |   3    | "Dan"    | 2019-03-21 | 300    |   4    | "Sam"    | 2019-04-21 | 400    |   5    | "Jenny"  | 2019-04-21 | 220    |   6    | "Jenny"  | 2019-04-12 | 330    |應該找到每個月總金額的最高買家,對于當前示例:{  MARCH: { customer='Dan', amount=300 },   APRIL: { customer='Jenny', amount=550 }}我找到了一個解決方案:public class Main {    public static void main(String[] args) {        List<Order> orders = List.of(                new Order(1L, "Sam", LocalDate.of(2019, 3, 21), 100L),                new Order(2L, "Nick", LocalDate.of(2019, 3, 21), 102L),                new Order(3L, "Dan", LocalDate.of(2019, 3, 21), 300L),                new Order(4L, "Sam", LocalDate.of(2019, 4, 21), 400L),                new Order(5L, "Jenny", LocalDate.of(2019, 4, 21), 220L),                new Order(6L, "Jenny", LocalDate.of(2019, 4, 12), 330L)        );        solution1(orders);    }     private static void solution1(List<Order> orders) {        final Map<Month, Map<String, Long>> buyersSummed = new HashMap<>();        for (Order order : orders) {            Map<String, Long> customerAmountMap = buyersSummed.computeIfAbsent(order.getOrderMonth(), mapping -> new HashMap<>());            customerAmountMap.putIfAbsent(order.getCustomer(), 0L);            Long customerAmount = customerAmountMap.get(order.getCustomer());            customerAmountMap.put(order.getCustomer(), customerAmount + order.getAmount());        }        final Map<Month, BuyerDetails> topBuyers = buyersSummed.entrySet().stream()                .collect(                        toMap(Entry::getKey, customerAmountEntry -> customerAmountEntry.getValue().entrySet().stream()                                .map(entry -> new BuyerDetails(entry.getKey(), entry.getValue()))                                .max(Comparator.comparingLong(BuyerDetails::getAmount)).orElseThrow())                );    }}
查看完整描述

6 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

嘗試使用groupingBy,summingLong如下comparingLong所示


Map<Month, BuyerDetails> topBuyers = orders.stream()

    .collect(Collectors.groupingBy(Order::getOrderMonth,

             Collectors.groupingBy(Order::getCustomer,

             Collectors.summingLong(Order::getAmount))))

    .entrySet().stream()

    .collect(Collectors.toMap(Map.Entry::getKey,

             order -> order.getValue().entrySet().stream()

            .max(Comparator.comparingLong(Map.Entry::getValue))

            .map(cust -> new BuyerDetails(cust.getKey(), cust.getValue())).get()));

輸出


{

  "MARCH": { "customer": "Dan", "amount": 300 }, 

  "APRIL": { "customer": "Jenny", "amount": 550 }

}


查看完整回答
反對 回復 2023-06-04
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

有沒有辦法在一個流中解決上述任務?

這取決于你所說的“在一個流中”是什么意思。您想要執(zhí)行一個縮減操作,該操作的最佳特征可能是一系列縮減的組合:

  • 按月對訂單進行分組

  • 在每個月組內,匯總每個客戶的訂單以產生總金額

  • 在每個月的每個客戶聚合結果組中,選擇數量最大的一個(注意:在關系的情況下沒有明確定義)

從 Stream API 的角度來看,對流執(zhí)行這些單獨的歸約中的任何一個都是對該流的終端操作。您可以使用新流處理結果,甚至在語法上將其鏈接在一起,但盡管這可能采用單個方法調用的語法形式,但它不會構成在單個流上發(fā)生的所有操作。

您還可以創(chuàng)建一個Collector(或一個的組件),以便通過收集輸入元素流直接獲得結果,但在內部,該收集器仍需要通過內部創(chuàng)建和消耗額外的來執(zhí)行單獨的歸約流,或通過非流 API 執(zhí)行相同的任務。如果您再次計算這些內部操作,不,它不構成對單個流的執(zhí)行操作。(但是,如果您不考慮這些內部縮減,那么是的,這一切都在一個流中完成。)


查看完整回答
反對 回復 2023-06-04
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

好吧,我們開始吧!以下代碼將為您提供所需的內容,只需調用 1 次即可stream():


Map<Month, BuyerDetails> grouped = orders.stream().collect(

  Collectors.groupingBy(Order::getOrderMonth,

    Collectors.collectingAndThen(

      Collectors.groupingBy(Order::getCustomer,

        Collectors.summingLong(Order::getAmount)

      ),

      ((Function<Map<String,Long>, Map.Entry<String,Long>>) 

        map -> Collections.max(

          map.entrySet(), Comparator.comparingLong(Map.Entry::getValue)

        )

      ).andThen(

        e -> new BuyerDetails(e.getKey(),e.getValue())

      )

    )

  )

);

System.out.println(grouped);

輸出:


{MARCH={ customer='Dan', amount=300 }, APRIL={ customer='Jenny', amount=550 }}


現在,這有點奇怪,所以讓我們逐行檢查它,看看發(fā)生了什么:


Map<Month, BuyerDetails> grouped = orders.stream().collect(

首先,我們流式傳輸我們的訂單,


  Collectors.groupingBy(Order::getOrderMonth,

按月分組,我們發(fā)現:


    Collectors.collectingAndThen(

      Collectors.groupingBy(Order::getCustomer,

每個客戶和


        Collectors.summingLong(Order::getAmount)

      ),

他們一個月內的總訂單。


      ((Function<Map<String,Long>, Map.Entry<String,Long>>)

(我們轉換為Function,所以我們可以使用andThen我們定義的 lambda 函數之類的方法)


        map -> Collections.max(

          map.entrySet(), Comparator.comparingLong(Map.Entry::getValue)

        )

對于每個月,我們都會找到具有最大訂單金額的客戶。


      ).andThen(

然后我們


        e -> new BuyerDetails(e.getKey(),e.getValue())

為所述客戶創(chuàng)建新的買家詳細信息


      )

    )

  )

);

并收集所有 Month/BuyerDetail 對。


System.out.println(grouped);

最后,我們打印創(chuàng)建的數據結構。


查看完整回答
反對 回復 2023-06-04
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

它有一個嵌套流,所以它不是一個流,它返回Map<String, Optional<BuyerDetails>>。



orders.stream()

        .collect(

            Collectors.groupingBy(Order::getOrderMonth,

                Collectors.collectingAndThen(

                        Collectors.groupingBy(

                                Order::getCustomer,

                                Collectors.summarizingLong(Order::getAmount)

                        ),

                        e -> e.entrySet()

                                .stream()

                                .map(entry -> new BuyerDetails(entry.getKey(), entry.getValue().getSum()))

                                .max(Comparator.comparingLong(BuyerDetails::getAmount))

                )

            )

        )

所以有3個步驟:


按月分組Collectors.groupingBy(Order::getOrderMonth,

按客戶名稱分組并匯總總訂單金額Collectors.groupingBy(Order::getCustomer, Collectors.summarizingLong( Order::getAmount))

過濾中間結果,只留下最大金額的客戶max(Comparator.comparingLong(BuyerDetails::getAmount))

輸出是


{

  APRIL = Optional [ BuyerDetails { customer = 'Jenny', amount = 550 } ],

  MARCH = Optional [ BuyerDetails { customer = 'Dan', amount = 300 } ]

}

我也很好奇這是否可以在沒有額外流的情況下完成。


查看完整回答
反對 回復 2023-06-04
?
www說

TA貢獻1775條經驗 獲得超8個贊

我的方法(3 個流):


private static void solution1(List<Order> orders) {

        final Map<Month, BuyerDetails> topBuyers = orders.stream().collect(

                Collectors.groupingBy(order -> order.getCustomer() + "$" + order.getOrderDate().getYear() + "." +

                                order.getOrderMonth(),

                        Collectors.reducing((ord1, ord2) -> {

                            ord1.setAmount(ord1.getAmount() + ord2.getAmount());

                            return ord1;

                        }))).values().stream()

                .collect(Collectors.groupingBy(order -> order.get().getOrderMonth(),

                        maxBy(Comparator.comparing(order -> order.get().getAmount())))).values().stream()

                .collect(

                        toMap((key) -> key.get().get().getOrderMonth(),

                                key -> new BuyerDetails(key.get().get().getCustomer(), key.get().get().getAmount())

                        )

                );

    }


查看完整回答
反對 回復 2023-06-04
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

這不能用單個流來完成,因為 和sum都是max終端操作,它們不能應用于同一個流。最好把它分成兩個操作


Map<Month, Map<String, Long>> sumsByMonth = orders.stream().collect(

        Collectors.groupingBy(

            Order::getOrderMonth,

            Collectors.groupingBy(

                    Order::getCustomer,

                    Collectors.mapping(

                            Order::getAmount,

                            Collectors.reducing(0L, a -> a, (a1, a2) -> a1 + a2)

                    )

            )

        )

);


Map<Month, BuyerDetails> topBuyers = sumsByMonth.entrySet().stream().collect(

        Collectors.toMap(

                Map.Entry::getKey,

                sums -> sums.getValue().entrySet().stream()

                        .max(Comparator.comparingLong(Map.Entry::getValue))

                        .map(e -> new BuyerDetails(e.getKey(), e.getValue()))

                        .get()

       )

);


查看完整回答
反對 回復 2023-06-04
  • 6 回答
  • 0 關注
  • 304 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號