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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java Streams - 按兩個(gè)條件匯總結(jié)果分組

Java Streams - 按兩個(gè)條件匯總結(jié)果分組

縹緲止盈 2023-06-04 15:23:14
我有一個(gè)訂單列表,我應(yīng)該按兩個(gè)標(biāo)準(zhǔn)進(jìn)行分組。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    |應(yīng)該找到每個(gè)月總金額的最高買家,對(duì)于當(dāng)前示例:{  MARCH: { customer='Dan', amount=300 },   APRIL: { customer='Jenny', amount=550 }}我找到了一個(gè)解決方案: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貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊

嘗試使用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 }

}


查看完整回答
反對(duì) 回復(fù) 2023-06-04
?
繁星淼淼

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊

有沒有辦法在一個(gè)流中解決上述任務(wù)?

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

  • 按月對(duì)訂單進(jìn)行分組

  • 在每個(gè)月組內(nèi),匯總每個(gè)客戶的訂單以產(chǎn)生總金額

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

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

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


查看完整回答
反對(duì) 回復(fù) 2023-06-04
?
長風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

好吧,我們開始吧!以下代碼將為您提供所需的內(nèi)容,只需調(diào)用 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 }}


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


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

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


  Collectors.groupingBy(Order::getOrderMonth,

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


    Collectors.collectingAndThen(

      Collectors.groupingBy(Order::getCustomer,

每個(gè)客戶和


        Collectors.summingLong(Order::getAmount)

      ),

他們一個(gè)月內(nèi)的總訂單。


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

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


        map -> Collections.max(

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

        )

對(duì)于每個(gè)月,我們都會(huì)找到具有最大訂單金額的客戶。


      ).andThen(

然后我們


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

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


      )

    )

  )

);

并收集所有 Month/BuyerDetail 對(duì)。


System.out.println(grouped);

最后,我們打印創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)。


查看完整回答
反對(duì) 回復(fù) 2023-06-04
?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊

它有一個(gè)嵌套流,所以它不是一個(gè)流,它返回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個(gè)步驟:


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

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

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

輸出是


{

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

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

}

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


查看完整回答
反對(duì) 回復(fù) 2023-06-04
?
www說

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊

我的方法(3 個(gè)流):


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())

                        )

                );

    }


查看完整回答
反對(duì) 回復(fù) 2023-06-04
?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

這不能用單個(gè)流來完成,因?yàn)?和sum都是max終端操作,它們不能應(yīng)用于同一個(gè)流。最好把它分成兩個(gè)操作


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()

       )

);


查看完整回答
反對(duì) 回復(fù) 2023-06-04
  • 6 回答
  • 0 關(guān)注
  • 283 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)