网站建设实训 课程标准,关岭做网站,网站开发 数字证书,设计网校目录
前言正文第一个小玩法 将集合通过Stream.collect() 转换成其他集合/数组#xff1a;第二个小玩法 聚合#xff08;求和、最小、最大、平均值、分组#xff09;总结前言
本身我是一个比较偏向少使用Stream的人#xff0c;因为调试比较不方便。
但是, 不得不说#…目录
前言正文第一个小玩法 将集合通过Stream.collect() 转换成其他集合/数组第二个小玩法 聚合求和、最小、最大、平均值、分组总结前言
本身我是一个比较偏向少使用Stream的人因为调试比较不方便。
但是, 不得不说stream确实会给我们编码带来便捷。 正文
Stream流 其实操作分三大块 创建 处理 收集
我今天想分享的是 收集 这part的玩法。 OK开始结合代码示例一起玩下
lombok依赖引入代码简洁一点 1 2 3 4 5 6 dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version1.18.20/version scopecompile/scope /dependency
准备一个UserDTO.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /** * 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的函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 private static ListUserDTO 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); ListUserDTO userList new ArrayList(); userList.add(userDTO); userList.add(userDTO2); userList.add(userDTO3); return userList; } 第一个小玩法 将集合通过Stream.collect() 转换成其他集合/数组
现在拿ListUserDTO 做例子
转成 HashSetUserDTO 1 2 3 ListUserDTO userList getUserList(); StreamUserDTO usersStream userList.stream(); HashSetUserDTO usersHashSet usersStream.collect(Collectors.toCollection(HashSet::new));
转成 SetUserDTO usersSet 1 2 3 ListUserDTO userList getUserList(); StreamUserDTO usersStream userList.stream(); SetUserDTO usersSet usersStream.collect(Collectors.toSet());
转成 ArrayListUserDTO 1 2 3 ListUserDTO userList getUserList(); StreamUserDTO usersStream userList.stream(); ArrayListUserDTO usersArrayList usersStream.collect(Collectors.toCollection(ArrayList::new));
转成 Object[] objects 1 2 3 ListUserDTO userList getUserList(); StreamUserDTO usersStream userList.stream(); Object[] objects usersStream.toArray();
转成 UserDTO[] users 1 2 3 4 5 6 ListUserDTO userList getUserList(); StreamUserDTO usersStream userList.stream(); UserDTO[] users usersStream.toArray(UserDTO[]::new); for (UserDTO user : users) { System.out.println(user.toString()); } 第二个小玩法 聚合求和、最小、最大、平均值、分组
找出年龄最大
stream.max
写法 1 1 2 3 4 5 6 7 8 ListUserDTO userList getUserList(); StreamUserDTO usersStream userList.stream(); OptionalUserDTO maxUserOptional usersStream.max((s1, s2) - s1.getAge() - s2.getAge()); if (maxUserOptional.isPresent()) { UserDTO masUser maxUserOptional.get(); System.out.println(masUser.toString()); }
写法2 1 2 3 4 5 6 ListUserDTO userList getUserList(); StreamUserDTO usersStream userList.stream(); OptionalUserDTO maxUserOptionalNew usersStream.max(Comparator.comparingInt(UserDTO::getAge)); if (maxUserOptionalNew.isPresent()) { UserDTO masUser maxUserOptionalNew.get(); System.out.println(masUser.toString()); }
效果 输出 UserDTO(name小秋, age30, sex男, hasOrientationtrue) 找出年龄最小
stream.min
写法 1 1 2 3 4 5 OptionalUserDTO minUserOptional usersStream.min(Comparator.comparingInt(UserDTO::getAge)); if (minUserOptional.isPresent()) { UserDTO minUser minUserOptional.get(); System.out.println(minUser.toString()); }
写法2 1 OptionalUserDTO min usersStream.collect(Collectors.minBy((s1, s2) - s1.getAge() - s2.getAge()));
求平均值 1 2 3 ListUserDTO userList getUserList(); StreamUserDTO usersStream userList.stream(); Double avgScore usersStream.collect(Collectors.averagingInt(UserDTO::getAge));
效果 求和
写法1 1 Integer reduceAgeSum usersStream.map(UserDTO::getAge).reduce(0, Integer::sum);
写法2 1 int ageSumNew usersStream.mapToInt(UserDTO::getAge).sum();
统计数量 1 long countNew usersStream.count();
简单分组
按照具体年龄分组: 1 2 //按照具体年龄分组 MapInteger, ListUserDTO ageGroupMap usersStream.collect(Collectors.groupingBy((UserDTO::getAge)));
效果 分组过程加写判断逻辑 1 2 3 4 5 6 7 8 //按照性别 分为男一组 女一组 MapInteger, ListUserDTO groupMap usersStream.collect(Collectors.groupingBy(s - { if (s.getSex().equals(男)) { return 1; } else { return 0; } }));
效果 多级复杂分组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //多级分组 // 1.先根据年龄分组 // 2.然后再根据性别分组 MapInteger, MapString, MapInteger, ListUserDTO moreGroupMap usersStream.collect(Collectors.groupingBy( //1.KEY(Integer) VALUE (MapString, MapInteger, ListUserDTO) UserDTO::getAge, Collectors.groupingBy( //2.KEY(String) VALUE (MapInteger, ListUserDTO) UserDTO::getSex, Collectors.groupingBy((userDTO) - { if (userDTO.getSex().equals(男)) { return 1; } else { return 0; } }))));
效果 总结
到此这篇关于Java8 Stream教程之collect()技巧的文章就介绍到这了,更多相关Java8 Stream collect()技巧内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家