国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java根據(jù)分組函數(shù)GroupingBy進(jìn)行多個(gè)條件組合分組

這篇具有很好參考價(jià)值的文章主要介紹了java根據(jù)分組函數(shù)GroupingBy進(jìn)行多個(gè)條件組合分組。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在SQL中經(jīng)常會(huì)用到分組,我們也常常遇到一些組合分組的場(chǎng)景。
java8分組 傳統(tǒng)寫法(單個(gè)字段分組)
場(chǎng)景:根據(jù) 城市 進(jìn)行分組
使用的是方法引用:User::getCity 來完成分組

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Demo2 {
    public static void main(String[] args) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // data list
        List<User> userList = Arrays.asList(
                User.builder().id(123456).name("Zhang, San").city("ShangHai").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(777777).name("Zhang, San").city("ShangHai").sex("woman").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(888888).name("Li, Si").city("ShangHai").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(999999).name("Zhan, San").city("HangZhou").sex("woman").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(555555).name("Li, Si").city("NaJin").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build()
        );
        Map<String, List<User>> groupMap = userList.stream()
        	.collect(Collectors.groupingBy(User::getCity));
        groupMap.forEach((k, v) -> {
            System.out.println(k);
            System.out.println(v);
        });
    }
}

java8分組 傳統(tǒng)寫法(多個(gè)字段分組)
場(chǎng)景:根據(jù) 城市,性別進(jìn)行分組
一般的寫法會(huì)是下面的這種寫法,通過lambda表達(dá)式將key的生成邏輯傳入進(jìn)去:u -> u.getCity() + “|” + u.getSex() 來實(shí)現(xiàn)分組的效果。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Demo2 {
    public static void main(String[] args) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // data list
        List<User> userList = Arrays.asList(
                User.builder().id(123456).name("Zhang, San").city("ShangHai").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(777777).name("Zhang, San").city("ShangHai").sex("woman").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(888888).name("Li, Si").city("ShangHai").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(999999).name("Zhan, San").city("HangZhou").sex("woman").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(555555).name("Li, Si").city("NaJin").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build()
        );
        Map<String, List<User>> groupMap = userList.stream()
        	.collect(Collectors.groupingBy(u -> u.getCity() + "|" + u.getSex()));
        groupMap.forEach((k, v) -> {
            System.out.println(k);
            System.out.println(v);
        });
    }
}

分析:多個(gè)分組條件 與 單個(gè)分組條件 兩種寫法
單個(gè)條件的分組用的比較多,userList.stream().collect(Collectors.groupingBy(User::getCity));
這種方法引用的方式看起來很清爽。
在我們遇到多個(gè)字段的分組的時(shí)候,我并不太想使用前面那種傳統(tǒng)的寫法①。

我在想,既然單個(gè)字段的分組寫法是:
userList.stream().collect(Collectors.groupingBy(User::getCity));
那么多個(gè)字段的寫法可否是下面這種( 類推 ),傳入多個(gè)方法引用!
userList.stream().collect(Collectors.groupingBy(User::getCity,User::getSex));

很可惜 jdk 類庫中Collectors 沒有提供這種寫法
因?yàn)閖dk沒有提供這種寫法,于是自己就想寫了一個(gè)Util來幫助我們使用多個(gè)方法引用的方式完成組合分組
MyBeanUtil groupingBy(userList, User::getSex, User::getCity);

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class MyBeanUtil {

    public static void main(String[] args) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // data list
        List<User> userList = Arrays.asList(
                User.builder().id(123456).name("Zhang, San").city("ShangHai").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(777777).name("Zhang, San").city("ShangHai").sex("woman").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(888888).name("Li, Si").city("ShangHai").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(999999).name("Zhan, San").city("HangZhou").sex("woman").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build(),
                User.builder().id(555555).name("Li, Si").city("NaJin").sex("man").birthDay(LocalDateTime.parse("2022-07-01 12:00:00", df)).build()
        );
        // 進(jìn)行分組,根據(jù)名字和城市分組
        Map<String, List<User>> groupMap = groupingBy(userList, User::getSex, User::getCity);
        //打印分組結(jié)果
        groupMap.forEach((k, v) -> {
            System.out.println(k);
            System.out.println(v);
        });
    }
    /**
     * 將數(shù)據(jù)分組,根據(jù)方法引用(bean的get方法)
     *
     * @param list      為分組的數(shù)據(jù)
     * @param functions get方法數(shù)組
     */
    @SafeVarargs
    public static <T, R> Map<String, List<T>> groupingBy(List<T> list, Function<T, R>... functions) {
        return list.stream().collect(Collectors.groupingBy(t -> groupingBy(t, functions)));
    }

    /**
     * 分組工具根據(jù)函數(shù)式接口使用分組,將數(shù)據(jù)根據(jù)分組結(jié)果進(jìn)行拆分
     */
    @SafeVarargs
    public static <T, R> String groupingBy(T t, Function<T, R>... functions) {
        if (functions == null || functions.length == 0) {
            throw new NullPointerException("functions數(shù)組不可以為空");
        } else if (functions.length == 1) {
            return functions[0].apply(t).toString();
        } else {
            return Arrays.stream(functions).map(fun -> fun.apply(t).toString()).reduce((str1, str2) -> str1 + "|" + str2).get();
        }
    }
}

再度優(yōu)化
依然不是很滿足這種寫法,因?yàn)檫@種寫法需要借助 Util 類,不夠接地氣!
更希望是下面這種接地氣的寫法:能夠完全集成在jdk類庫中
點(diǎn)擊下方鏈接,查看原文對(duì)于jdk源代碼修改的寫法
再度優(yōu)化,修改源碼文章來源地址http://www.zghlxwxcb.cn/news/detail-418542.html

到了這里,關(guān)于java根據(jù)分組函數(shù)GroupingBy進(jìn)行多個(gè)條件組合分組的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java Stream流實(shí)現(xiàn)多字段分組groupingBy操作

    近期的項(xiàng)目里,遇到一個(gè)需求:對(duì)于含有多個(gè)元素的List,按照其中的某幾個(gè)屬性進(jìn)行分組,比如Report::getPersonID、Report::getSchoolYear、Report::getDataType等字段。下面就讓我們討論一下如何比較優(yōu)雅的按多字段進(jìn)行分組groupingBy。 利用單個(gè)字段進(jìn)行分組 如上面的Report類,如果對(duì)于其

    2024年02月07日
    瀏覽(20)
  • Java8的stream之groupingBy()分組排序

    Java8的stream之groupingBy()分組排序

    groupingBy()是Stream API中最強(qiáng)大的收集器Collector之一,提供與SQL的GROUP BY子句類似的功能。 需要指定一個(gè)屬性才能使用,通過該屬性執(zhí)行分組。我們通過提供功能接口的實(shí)現(xiàn)來實(shí)現(xiàn)這一點(diǎn) - 通常通過傳遞lambda表達(dá)式。 TreeMap默認(rèn)按照key升序排序,collectPlan.descendingMap()可以進(jìn)行降序排

    2024年02月12日
    瀏覽(25)
  • Java解決stream流Collectors.groupingBy 分組統(tǒng)計(jì)可能報(bào)空指針異常

    Java解決stream流Collectors.groupingBy 分組統(tǒng)計(jì)可能報(bào)空指針異常

    在使用stream流的Collectors.groupingBy做分組統(tǒng)計(jì)時(shí)(示例代碼如下) 如果統(tǒng)計(jì)的字段userName有null值則會(huì)報(bào)如下錯(cuò)誤 解決方法為在統(tǒng)計(jì)之前增加一個(gè)filter方法將null值事先過濾掉。代碼如下:

    2024年02月04日
    瀏覽(43)
  • excel中的vlookup如何實(shí)現(xiàn)根據(jù)多個(gè)條件查找?

    excel中的vlookup如何實(shí)現(xiàn)根據(jù)多個(gè)條件查找?

    Excel 中根據(jù)一個(gè)條件查找非常方便,Excel 提供了內(nèi)置函數(shù) VLOOKUP。但是實(shí)際中往往有多種情形,需要根據(jù)多個(gè)條件進(jìn)行查找操作,目前沒有現(xiàn)成的內(nèi)置函數(shù)。 本篇介紹 VLOOKP+CHOOSE 組合查找公式,可根據(jù)任意條件數(shù)量進(jìn)行查找。 下面以兩個(gè)條件進(jìn)行查找為例,介紹 VLOOKP+CHOOSE

    2024年02月15日
    瀏覽(22)
  • ElasticSearch系列 - SpringBoot整合ES:組合多個(gè)查詢條件 bool 查詢

    01. ElasticSearch 布爾查詢是什么? 在實(shí)際應(yīng)用中,我們很有可能會(huì)查詢多個(gè)值或字段。 一個(gè) bool 查詢由三部分組成: must:所有的語句都必須(must) 匹配,與 AND 等價(jià)。 must_not:所有的語句都不能(must not)匹配,與 NOT 等價(jià)。 should:至少有一個(gè)語句要匹配,與 OR 等價(jià)。 02.

    2023年04月08日
    瀏覽(28)
  • MySQL如何查詢根據(jù)某一條件分組,再查詢出每組數(shù)據(jù)中時(shí)間最早或最晚的數(shù)據(jù)

    最近遇到個(gè)需求,需要先根據(jù)A條件進(jìn)行分組,然后查詢出每組數(shù)據(jù)中時(shí)間最近的一條數(shù)據(jù),立馬就寫出了sql語句 但是執(zhí)行了一下,發(fā)現(xiàn)不對(duì),子查詢中 order by 貌似失效了,查出來的數(shù)據(jù)并不是要想要的時(shí)間最近的數(shù)據(jù)。 經(jīng)過我的研究,發(fā)現(xiàn),想要子查詢中使用order by生效,

    2024年03月09日
    瀏覽(26)
  • 根據(jù)list中的對(duì)象某個(gè)屬性 進(jìn)行分組

    1,跟據(jù)某個(gè)屬性分組OfficeId 2,根據(jù)某個(gè)屬性分組OfficeId,匯總某個(gè)屬性Money 3,根據(jù)某個(gè)屬性添加條件過濾數(shù)據(jù), 4,判斷一組對(duì)象里面有沒有屬性值是某個(gè)值 5,取出一組對(duì)象的某個(gè)屬性組成一個(gè)新集合 6.List 去重 7.java stream中的findFirst 返回出現(xiàn)的第一個(gè)結(jié)果 8.stream自定義k

    2024年02月11日
    瀏覽(21)
  • MySQL根據(jù)出生日期查詢年齡,以及對(duì)年齡進(jìn)行分組統(tǒng)計(jì)

    MySQL根據(jù)出生日期查詢年齡,以及對(duì)年齡進(jìn)行分組統(tǒng)計(jì)

    表stu數(shù)據(jù)如下 1. 根據(jù)出生日期查詢年齡 返回結(jié)果: 函數(shù)DATE():提取日期或日期/時(shí)間表達(dá)式的日期部分; 函數(shù)CURDATE():返回當(dāng)前的日期; 函數(shù)TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2):計(jì)算兩個(gè)日期的時(shí)間差,unit是計(jì)算時(shí)間差的單位,可以是SECOND秒、MINUTE分鐘、HOUR小時(shí)、DAY天

    2024年02月11日
    瀏覽(23)
  • JavaScript、微信小程序 根據(jù)漢字拼音首字母進(jìn)行歸類分組

    JavaScript、微信小程序 根據(jù)漢字拼音首字母進(jìn)行歸類分組

    在微信小程序里面不支持這個(gè)localeCompare方法,所以有了下面的方法 我們需要一個(gè) 開源的漢字庫 ,也就是碼表。這個(gè)庫就可以。git庫 不想去git下載直接拉到最底下有js文件,直接復(fù)制就行。 然后頁面引入 china.js代碼

    2024年02月11日
    瀏覽(26)
  • Mysql 合并多個(gè)分組。GROUP_CONCAT 函數(shù) 及其平替函數(shù)

    GROUP_CONCAT 函數(shù)用于將一個(gè)分組內(nèi)的多行數(shù)據(jù)合并成一個(gè)字符串,并以指定的分隔符進(jìn)行分隔。常用于需要將一個(gè)分組內(nèi)的多條數(shù)據(jù)以字符串的形式展示的情況。語法如下: GROUP_CONCAT(expr [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [, expr ...]] [SEPARATOR str_val]) 其中,expr 表示要

    2024年02月02日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包