最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8?Stream教程之collect()的技巧

 更新時間:2022年10月14日 11:18:36   作者:小目標青年  
Java8引入了全新的Stream?API,這里的Stream和I/O流不同,它更像具有Iterable的集合類,但行為和集合類又有所不同,下面這篇文章主要給大家介紹了關于Java8?Stream教程之collect()的技巧,需要的朋友可以參考下

前言

本身我是一個比較偏向少使用Stream的人,因為調(diào)試比較不方便。

但是, 不得不說,stream確實會給我們編碼帶來便捷。

正文

Stream流 其實操作分三大塊 : 

  •  創(chuàng)建
  •  處理 
  •  收集

我今天想分享的是 收集 這part的玩法。

OK,開始結合代碼示例一起玩下:

lombok依賴引入,代碼簡潔一點:

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>compile</scope>
        </dependency>

準備一個UserDTO.java 

/**
 * @Author: JCccc
 * @Date: 2022-9-20 01:25
 * @Description:
 */
@Data
public class UserDTO {
 
    /**
     * 姓名
     */
    private  String name;
    /**
     * 年齡
     */
    private  Integer age;
    /**
     * 性別
     */
    private  String sex;
    /**
     * 是否有方向
     */
    private  Boolean hasOrientation;
}

準備一個模擬獲取List的函數(shù):

    private static List<UserDTO> getUserList() {
        UserDTO userDTO = new UserDTO();
        userDTO.setName("小冬");
        userDTO.setAge(18);
        userDTO.setSex("男");
        userDTO.setHasOrientation(false);
        UserDTO userDTO2 = new UserDTO();
        userDTO2.setName("小秋");
        userDTO2.setAge(30);
        userDTO2.setSex("男");
        userDTO2.setHasOrientation(true);
        UserDTO userDTO3 = new UserDTO();
        userDTO3.setName("春");
        userDTO3.setAge(18);
        userDTO3.setSex("女");
        userDTO3.setHasOrientation(true);
        List<UserDTO> userList = new ArrayList<>();
        userList.add(userDTO);
        userList.add(userDTO2);
        userList.add(userDTO3);
        return userList;
    }

第一個小玩法 將集合通過Stream.collect() 轉(zhuǎn)換成其他集合/數(shù)組:

現(xiàn)在拿List<UserDTO> 做例子

轉(zhuǎn)成  HashSet<UserDTO> :

        List<UserDTO> userList = getUserList();
        Stream<UserDTO> usersStream = userList.stream();
        HashSet<UserDTO> usersHashSet = usersStream.collect(Collectors.toCollection(HashSet::new));

轉(zhuǎn)成  Set<UserDTO> usersSet :

        List<UserDTO> userList = getUserList();
        Stream<UserDTO> usersStream = userList.stream();
        Set<UserDTO> usersSet = usersStream.collect(Collectors.toSet());

轉(zhuǎn)成  ArrayList<UserDTO> :

        List<UserDTO> userList = getUserList();
        Stream<UserDTO> usersStream = userList.stream();
        ArrayList<UserDTO> usersArrayList = usersStream.collect(Collectors.toCollection(ArrayList::new));

轉(zhuǎn)成  Object[] objects :

        List<UserDTO> userList = getUserList();
        Stream<UserDTO> usersStream = userList.stream();
        Object[] objects = usersStream.toArray();

轉(zhuǎn)成  UserDTO[] users :

        List<UserDTO> userList = getUserList();
        Stream<UserDTO> usersStream = userList.stream();
        UserDTO[] users = usersStream.toArray(UserDTO[]::new);
        for (UserDTO user : users) {
            System.out.println(user.toString());
        }

第二個小玩法 聚合(求和、最小、最大、平均值、分組)

找出年齡最大:

stream.max()

寫法 1:

List<UserDTO> userList = getUserList();
Stream<UserDTO> usersStream = userList.stream();
Optional<UserDTO> maxUserOptional = 
        usersStream.max((s1, s2) -> s1.getAge() - s2.getAge());
if (maxUserOptional.isPresent()) {
    UserDTO masUser = maxUserOptional.get();
    System.out.println(masUser.toString());
}

寫法2: 

List<UserDTO> userList = getUserList(); Stream<UserDTO> usersStream = userList.stream();
Optional<UserDTO> maxUserOptionalNew = usersStream.max(Comparator.comparingInt(UserDTO::getAge));
if (maxUserOptionalNew.isPresent()) {
    UserDTO masUser = maxUserOptionalNew.get();
    System.out.println(masUser.toString());
}

效果:

 輸出:

UserDTO(name=小秋, age=30, sex=男, hasOrientation=true)

找出年齡最?。?/strong>

stream.min()

寫法 1:

Optional<UserDTO> minUserOptional = usersStream.min(Comparator.comparingInt(UserDTO::getAge));
if (minUserOptional.isPresent()) {
    UserDTO minUser = minUserOptional.get();
    System.out.println(minUser.toString());
}

寫法2: 

Optional<UserDTO> min = usersStream.collect(Collectors.minBy((s1, s2) -> s1.getAge() - s2.getAge()));

求平均值:

List<UserDTO> userList = getUserList();
Stream<UserDTO> usersStream = userList.stream();
Double avgScore = usersStream.collect(Collectors.averagingInt(UserDTO::getAge));

效果:

求和:

寫法1:

Integer reduceAgeSum = usersStream.map(UserDTO::getAge).reduce(0, Integer::sum);

寫法2:

int ageSumNew = usersStream.mapToInt(UserDTO::getAge).sum();

統(tǒng)計數(shù)量:

long countNew = usersStream.count();

簡單分組:

按照具體年齡分組:

//按照具體年齡分組
Map<Integer, List<UserDTO>> ageGroupMap = usersStream.collect(Collectors.groupingBy((UserDTO::getAge)));

效果: 

分組過程加寫判斷邏輯:

//按照性別 分為"男"一組  "女"一組
Map<Integer, List<UserDTO>> groupMap = usersStream.collect(Collectors.groupingBy(s -> {
    if (s.getSex().equals("男")) {
        return 1;
    } else {
        return 0;
    }
}));

效果:

多級復雜分組:

//多級分組
// 1.先根據(jù)年齡分組
// 2.然后再根據(jù)性別分組
Map<Integer, Map<String, Map<Integer, List<UserDTO>>>> moreGroupMap = usersStream.collect(Collectors.groupingBy(

        //1.KEY(Integer)             VALUE (Map<String, Map<Integer, List<UserDTO>>)
        UserDTO::getAge, Collectors.groupingBy(
                //2.KEY(String)             VALUE (Map<Integer, List<UserDTO>>)
                UserDTO::getSex, Collectors.groupingBy((userDTO) -> {
                    if (userDTO.getSex().equals("男")) {
                        return 1;
                    } else {
                        return 0;
                    }
                }))));

效果:

總結

到此這篇關于Java8 Stream教程之collect()技巧的文章就介紹到這了,更多相關Java8 Stream collect()技巧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot+WebSocket+Netty實現(xiàn)消息推送的示例代碼

    SpringBoot+WebSocket+Netty實現(xiàn)消息推送的示例代碼

    這篇文章主要介紹了SpringBoot+WebSocket+Netty實現(xiàn)消息推送的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • spring boot 測試單元修改數(shù)據(jù)庫不成功的解決

    spring boot 測試單元修改數(shù)據(jù)庫不成功的解決

    這篇文章主要介紹了spring boot 測試單元修改數(shù)據(jù)庫不成功的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法

    使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法

    這篇文章主要介紹了使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法,這也是各大計算機考試和ACM以及面試的常見基礎問題,需要的朋友可以參考下
    2015-08-08
  • MyBatis詳細講解DAO代理的使用

    MyBatis詳細講解DAO代理的使用

    MyBatis允許只聲明一個dao接口,而無需寫dao實現(xiàn)類的方式實現(xiàn)數(shù)據(jù)庫操作。前提是必須保證Mapper文件中的<mapper>標簽的namespace屬性值必須要和dao接口的類路徑一致,MyBatis容器會自動通過動態(tài)代理生成接口的實現(xiàn)類
    2022-04-04
  • java多線程編程必備volatile與synchronized深入理解

    java多線程編程必備volatile與synchronized深入理解

    這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • spring boot 統(tǒng)一JSON格式的接口返回結果的實現(xiàn)

    spring boot 統(tǒng)一JSON格式的接口返回結果的實現(xiàn)

    這篇文章主要介紹了spring boot 統(tǒng)一JSON格式的接口返回結果的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • java8之lambda表達式用法總結

    java8之lambda表達式用法總結

    這篇文章主要介紹了java8之lambda表達式用法總結,需要的朋友可以參考下
    2020-02-02
  • Spring Boot整合消息隊列RabbitMQ的實現(xiàn)示例

    Spring Boot整合消息隊列RabbitMQ的實現(xiàn)示例

    本文主要介紹了Spring Boot整合消息隊列RabbitMQ的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • 三道java新手入門面試題,通往自由的道路--多線程

    三道java新手入門面試題,通往自由的道路--多線程

    這篇文章主要為大家分享了最有價值的3道多線程面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結構和算法相關的題目、經(jīng)典面試編程題等,對hashCode方法的設計、垃圾收集的堆和代進行剖析,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C# 中Excel導入時判斷是否被占用三種方法

    C# 中Excel導入時判斷是否被占用三種方法

    這篇文章主要介紹了C# 中Excel導入時 判斷是否被占用三種方法的相關資料,需要的朋友可以參考下
    2017-04-04

最新評論

昌江| 宜黄县| 珲春市| 洛南县| 乌兰浩特市| 方山县| 荣成市| 广安市| 襄樊市| 呼图壁县| 镇平县| 白沙| 彝良县| 苍梧县| 拉萨市| 岱山县| 康马县| 虞城县| 和平区| 德阳市| 延寿县| 赤水市| 天台县| 得荣县| 武川县| 柘城县| 和龙市| 旺苍县| 健康| 莱芜市| 崇州市| 体育| 上杭县| 广南县| 德令哈市| 元阳县| 大连市| 永顺县| 汾西县| 金华市| 临清市|