0


Java List Stream流操作实战教学,轻松分组、合并、筛选、拼接、拆分、替换,复制可用!

1、前言

今日无事,记录下常用的一些Stream流操作。

很多案例只是提供思路,活学活用!

废话不多说直接上干货!

2、实体类

设置几个常见属性;

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class User implements Serializable {
  5. private String userId;
  6. private String userName;
  7. private String areaCode;
  8. private String areaName;
  9. private Integer workDay;
  10. }

3、具体操作

1、提取某一属性作为List 常用于数据处理时抽取特定字段

  1. /*
  2. *1、Stream 只取某一字段作为List sorted排序 distinct 去重
  3. */
  4. List<String> areaCodes = userList.stream().map(User::getAreaCode).sorted().distinct().collect(Collectors.toList());
  5. System.out.println(areaCodes);
  6. List<String> names = userList.stream().map(User::getUserName).distinct().collect(Collectors.toList());
  7. System.out.println(names);

效果:

2、stream 替换某一字段属性 常用于更改特定值

  1. /*
  2. 2、stream 替换某一字段属性 替换workDay
  3. */
  4. List<User> newUserList = userList.stream().map(a -> {
  5. String xzqhdm = a.getAreaCode();
  6. switch (xzqhdm) {
  7. //雄安新区规划
  8. case "130100":
  9. a.setWorkDay(20);
  10. break;
  11. case "130200":
  12. a.setWorkDay(22);
  13. break;
  14. }
  15. return a;
  16. }).collect(Collectors.toList());
  17. newUserList.stream().forEach(a->{
  18. System.out.println(a);
  19. });

效果:

3、根据某字段排序

  1. /*
  2. 3、根据某字段排序逆序
  3. */
  4. List<User> reverseOrderCollect = userList.stream()
  5. .sorted(Comparator.comparing(User::getUserId, Comparator.reverseOrder()))
  6. .collect(Collectors.toList());
  7. System.out.println("--排序逆序--");
  8. reverseOrderCollect.stream().forEach(a->{
  9. System.out.println(a);
  10. });
  11. List<User> sortCollect = userList.stream()
  12. .sorted(Comparator.comparing(User::getUserId))
  13. .collect(Collectors.toList());
  14. System.out.println("--排序--");
  15. sortCollect.stream().forEach(a->{
  16. System.out.println(a);
  17. });

效果:

4、筛选出符合条件数据 并取单一属性 常用与数据集筛选

  1. /*
  2. 4、筛选出符合条件数据 并取单一属性 (筛选areacode为130100 的数据湖)
  3. */
  4. List<User> user130100List = userList.stream().filter(a -> "130100".equals(a.getAreaCode())).collect(Collectors.toList());
  5. System.out.println("--筛选出符合条件数据 并取单一属性--");
  6. user130100List.stream().forEach(a->{
  7. System.out.println(a);
  8. });

效果:

5、根据某一字段是否包含字符分组 true、false 也可按照属性分组 常和6一起用处理数据

  1. /*
  2. 5、根据某一字段是否包含字符分组 true、false
  3. */
  4. Map<Boolean, List<User>> groupByMap = userList.stream().collect(Collectors.groupingBy(
  5. a -> a.getUserName().contains("赵")
  6. ));
  7. System.out.println("--根据某一字段是否包含字符分组-");
  8. System.out.println(groupByMap.get(true));
  9. System.out.println(groupByMap.get(false));

效果:

6、分组后遍历map执行方法

  1. System.out.println("--根据某一字段是否包含字符分组-");
  2. groupByMap.forEach((isZhao, list) ->
  3. testZhao(isZhao, list)
  4. );
  5. private static void testZhao(Boolean isZhao, List<User> list){
  6. if (isZhao){
  7. list.stream().forEach(a->{
  8. System.out.println("赵氏精英");
  9. });
  10. }else{
  11. list.stream().forEach(a->{
  12. System.out.println("非赵氏精英");
  13. });
  14. }
  15. }

效果:

7、根据某一属性拼接逗号 常用于共有属性字段拼接

  1. /*
  2. 7、 根据某一字段拼接","
  3. */
  4. String allUserName = userList.stream()
  5. .map(User::getUserName)
  6. .collect(Collectors.joining(","));
  7. System.out.println("--根据某一字段拼接\",\"--");
  8. System.out.println(allUserName);

效果

8、根据某一字段分组

  1. /*
  2. 8、根据某一字段分组
  3. */
  4. Map<String, List<User>> groupingByMap = userList.stream()
  5. .collect(Collectors.groupingBy(User::getAreaCode));
  6. System.out.println("--根据某一字段分组--");
  7. System.out.println(groupingByMap.get("130100"));
  8. System.out.println(groupingByMap.get("130200"));

效果:

9、根据两个list集合某相同属性合并(赋值)

  1. /*
  2. 9\根据某属性合并或替换两个list集合 (根据username 合并workday)
  3. */
  4. userList = userList.stream().map(m -> {
  5. newUserList.stream().filter(m2 -> Objects.equals(m.getUserName(), m2.getUserName())).forEach(
  6. m2 -> {
  7. m.setWorkDay(m2.getWorkDay()+m.getWorkDay());
  8. m.setAreaCode(String.valueOf(m.getWorkDay()));
  9. });
  10. return m;
  11. }).collect(Collectors.toList());
  12. System.out.println("--根据某属性合并两个list集合--");
  13. userList.stream().forEach(a->{
  14. System.out.println(a);
  15. });

效果:

10、根据某属性去重

  1. System.out.println("--去重--");
  2. userList.stream()
  3. .filter(distinctByKey1(a->a.getWorkDay()))
  4. .forEach(System.out::println);
  5. static <T> Predicate<T> distinctByKey1(Function<? super T, ?> keyExtractor) {
  6. Map<Object, Boolean> seen = new ConcurrentHashMap<>();
  7. return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
  8. }

效果:

11、根据某字段拆分为有序List

  1. /*
  2. 11、根据某字段拆分为有序List
  3. */
  4. System.out.println("--拆分有序list--");
  5. userList.stream()
  6. //默认hashmap 无序,需要设置有序map
  7. .collect(Collectors.groupingBy(User::getAreaCode, LinkedHashMap::new, Collectors.toList()))
  8. .values().stream().collect(Collectors.toList()).forEach(System.out::println);

效果:

4、完整代码

  1. private static String[] NAME = new String[]{
  2. "赵牛马", "钱牛马", "孙牛马", "李牛马", "周牛马"
  3. };
  4. public static void main(String[] args) {
  5. List<String> nameList = Arrays.asList(NAME);
  6. List<User> userList = new ArrayList<>();
  7. User user;
  8. for (int i = 0; i < 5; i++) {
  9. user = new User();
  10. user.setUserId(String.valueOf(i));
  11. user.setUserName(nameList.get(i) + (i + 1) * 2);
  12. if ((i & 1) == 0) {
  13. user.setAreaCode("130200");
  14. user.setAreaName("唐山");
  15. } else {
  16. user.setAreaCode("130100");
  17. user.setAreaName("石家庄");
  18. }
  19. user.setWorkDay((i + 7) * (i + 1));
  20. System.out.println(user);
  21. userList.add(user);
  22. }
  23. /*
  24. *1、Stream 只取某一字段作为List sorted排序
  25. */
  26. List<String> years = userList.stream().map(User::getAreaCode).sorted().distinct().collect(Collectors.toList());
  27. System.out.println(years);
  28. List<String> names = userList.stream().map(User::getUserName).distinct().collect(Collectors.toList());
  29. System.out.println(names);
  30. /*
  31. 2、stream 替换某一字段属性 替换workDay
  32. */
  33. List<User> newUserList = userList.stream().map(a -> {
  34. String xzqhdm = a.getAreaCode();
  35. switch (xzqhdm) {
  36. //雄安新区规划
  37. case "130100":
  38. a.setWorkDay(33);
  39. break;
  40. case "130200":
  41. a.setWorkDay(12);
  42. break;
  43. }
  44. return a;
  45. }).collect(Collectors.toList());
  46. System.out.println("--替换某一字段属性 --");
  47. newUserList.stream().forEach(a -> {
  48. System.out.println(a);
  49. });
  50. /*
  51. 3、根据某字段排序逆序
  52. */
  53. List<User> reverseOrderCollect = userList.stream()
  54. .sorted(Comparator.comparing(User::getUserId, Comparator.reverseOrder()))
  55. .collect(Collectors.toList());
  56. System.out.println("--排序逆序--");
  57. reverseOrderCollect.stream().forEach(a -> {
  58. System.out.println(a);
  59. });
  60. List<User> sortCollect = userList.stream()
  61. .sorted(Comparator.comparing(User::getUserId))
  62. .collect(Collectors.toList());
  63. System.out.println("--排序--");
  64. sortCollect.stream().forEach(a -> {
  65. System.out.println(a);
  66. });
  67. /*
  68. 4、筛选出符合条件数据 并取单一属性 (筛选areacode为130100 的数据湖)
  69. */
  70. List<User> user130100List = userList.stream().filter(a -> "130100".equals(a.getAreaCode())).collect(Collectors.toList());
  71. System.out.println("--筛选出符合条件数据 并取单一属性--");
  72. user130100List.stream().forEach(a -> {
  73. System.out.println(a);
  74. });
  75. /*
  76. 5、根据某一字段是否包含字符分组 true、false
  77. */
  78. Map<Boolean, List<User>> groupByMap = userList.stream().collect(Collectors.groupingBy(
  79. a -> a.getUserName().contains("赵")
  80. ));
  81. System.out.println("--根据某一字段是否包含字符分组-");
  82. System.out.println(groupByMap.get(true));
  83. System.out.println(groupByMap.get(false));
  84. /*
  85. * 6、根据某一字段是否包含某字符串拆分并遍历
  86. */
  87. System.out.println("--根据某一字段是否包含字符分组-");
  88. groupByMap.forEach((isZhao, list) ->
  89. testZhao(isZhao, list)
  90. );
  91. /*
  92. 7、 根据某一字段拼接","
  93. */
  94. String allUserName = userList.stream()
  95. .map(User::getUserName)
  96. .collect(Collectors.joining(","));
  97. System.out.println("--根据某一字段拼接\",\"--");
  98. System.out.println(allUserName);
  99. /*
  100. 8、根据某一字段分组
  101. */
  102. Map<String, List<User>> groupingByMap = userList.stream()
  103. .collect(Collectors.groupingBy(User::getAreaCode));
  104. System.out.println("--根据某一字段分组--");
  105. System.out.println(groupingByMap.get("130100"));
  106. System.out.println(groupingByMap.get("130200"));
  107. /*
  108. 9\根据某属性合并或替换两个list集合 (根据username 合并workday)
  109. */
  110. userList = userList.stream().map(m -> {
  111. newUserList.stream().filter(m2 -> Objects.equals(m.getUserName(), m2.getUserName())).forEach(
  112. m2 -> {
  113. m.setWorkDay(m2.getWorkDay() + m.getWorkDay());
  114. m.setAreaCode(String.valueOf(m.getWorkDay()));
  115. });
  116. return m;
  117. }).collect(Collectors.toList());
  118. System.out.println("--根据某属性合并两个list集合--");
  119. userList.stream().forEach(a -> {
  120. System.out.println(a);
  121. });
  122. /*
  123. 10、去重
  124. */
  125. System.out.println("--去重--");
  126. userList.stream()
  127. .filter(distinctByKey1(a -> a.getWorkDay()))
  128. .forEach(System.out::println);
  129. /*
  130. 11、根据某字段拆分为有序List
  131. */
  132. System.out.println("--拆分有序list--");
  133. userList.stream()
  134. //默认hashmap 无序,需要设置有序map
  135. .collect(Collectors.groupingBy(User::getAreaCode, LinkedHashMap::new, Collectors.toList()))
  136. .values().stream().collect(Collectors.toList()).forEach(System.out::println);
  137. }
  138. private static void testZhao(Boolean isZhao, List<User> list) {
  139. if (isZhao) {
  140. list.stream().forEach(a -> {
  141. System.out.println("赵氏精英");
  142. });
  143. } else {
  144. list.stream().forEach(a -> {
  145. System.out.println("非赵氏精英");
  146. });
  147. }
  148. }
  149. static <T> Predicate<T> distinctByKey1(Function<? super T, ?> keyExtractor) {
  150. Map<Object, Boolean> seen = new ConcurrentHashMap<>();
  151. return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
  152. }
标签: java 开发语言

本文转载自: https://blog.csdn.net/Su7148/article/details/141681913
版权归原作者 云梦轻掩楼 所有, 如有侵权,请联系我们删除。

“Java List Stream流操作实战教学,轻松分组、合并、筛选、拼接、拆分、替换,复制可用!”的评论:

还没有评论