<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 8 Stream 之 collect() 的奇技淫巧

          共 8779字,需瀏覽 18分鐘

           ·

          2022-11-22 03:18

          ????關(guān)注后回復(fù) “進(jìn)群” ,拉你進(jìn)程序員交流群????


          前言

          本身我是一個(gè)比較偏向少使用Stream的人,因?yàn)檎{(diào)試比較不方便。

          但是, 不得不說(shuō),stream確實(shí)會(huì)給我們編碼帶來(lái)便捷。

          所以還是忍不住想分享一些奇技淫巧。

          正文

          Stream流 其實(shí)操作分三大塊 :

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

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

          OK,開(kāi)始結(jié)合代碼示例一起玩下:

          lombok依賴(lài)引入,代碼簡(jiǎn)潔一點(diǎn):

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

          準(zhǔn)備一個(gè)UserDTO.java

          /**
           * @Author: JCccc
           * @Description:
           */

          @Data
          public class UserDTO {
           
              /**
               * 姓名
               */

              private  String name;
              /**
               * 年齡
               */

              private  Integer age;
              /**
               * 性別
               */

              private  String sex;
              /**
               * 是否有方向
               */

              private  Boolean hasOrientation;
           
          }

          準(zhǔn)備一個(gè)模擬獲取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;
          }

          第一個(gè)小玩法

          將集合通過(guò)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());
          }

          第二個(gè)小玩法

          聚合(求和、最小、最大、平均值、分組)

          找出年齡最大:
          stream.max()

          寫(xiě)法 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());
          }

          寫(xiě)法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)
          找出年齡最小:
          stream.min()

          寫(xiě)法 1:

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

          寫(xiě)法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));

          效果:

          求和:

          寫(xiě)法1:

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

          寫(xiě)法2:

          int ageSumNew = usersStream.mapToInt(UserDTO::getAge).sum();
          統(tǒng)計(jì)數(shù)量:
          long countNew = usersStream.count();
          簡(jiǎn)單分組:

          按照具體年齡分組:

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

          效果:

          分組過(guò)程加寫(xiě)判斷邏輯:

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

          效果:

          多級(jí)復(fù)雜分組:
          //多級(jí)分組
          // 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;
                         }
                     }))));

          效果:

          來(lái)源:blog.csdn.net/qq_35387940/article/details/127008965

          -End-

          最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來(lái),可以說(shuō)是程序員面試必備!所有資料都整理到網(wǎng)盤(pán)了,歡迎下載!

          點(diǎn)擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取

          在看點(diǎn)這里好文分享給更多人↓↓

          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产又粗又大又爽视频 | 欧美一级爱爱 | 色哟哟《欧美精品》 | 国产黄片乱伦 | 加勒比久操视频 |