Java8中stream流处理数据21个小案例(学习使用)

简介: Java8中stream流处理数据21个小案例(学习使用)

1、首先准备两个类(苹果类,可以一个苹果颜色的枚举)

1. public class Apple {
2. // 名字
3. private String name;
4. // 重量
5. private double weight;
6. // 颜色(枚举类)
7. private Color color;
8. // 城市
9. private String nation;
10. 
11. public Apple() {
12.     }
13. 
14. @Override
15. public String toString() {
16. return "Apple{" +
17. "name='" + name + '\'' +
18. ", weight=" + weight +
19. ", color=" + color +
20. ", nation='" + nation + '\'' +
21. '}';
22.     }
23. 
24. @Override
25. public int hashCode() {
26. return Objects.hash(name, weight, color, nation);
27.     }
28. 
29. public String getName() {
30. return name;
31.     }
32. 
33. public void setName(String name) {
34. this.name = name;
35.     }
36. 
37. public double getWeight() {
38. return weight;
39.     }
40. 
41. public void setWeight(double weight) {
42. this.weight = weight;
43.     }
44. 
45. public Color getColor() {
46. return color;
47.     }
48. 
49. public void setColor(Color color) {
50. this.color = color;
51.     }
52. 
53. public String getNation() {
54. return nation;
55.     }
56. 
57. public void setNation(String nation) {
58. this.nation = nation;
59.     }
60. 
61. public Apple(String name, double weight, Color color, String nation) {
62. this.name = name;
63. this.weight = weight;
64. this.color = color;
65. this.nation = nation;
66.     }
67. }
1. public enum Color {
2. /**
3.      * 红色,绿色,蓝色
4.      */
5.     RED("红色"),GREEN("绿色"),Blue("蓝色");
6. private final String co;
7. 
8.     Color(String co) {
9. this.co = co;
10.     }
11. public String getCo() {
12. return co;
13.     }
14. }

2、向集合中加入数据,开始处理list集合

1. Apple apple1 = new Apple("Apple1", 32.23, Color.RED, "china");
2. Apple apple2 = new Apple("Apple2", 23, Color.RED, "japan");
3. Apple apple3 = new Apple("Apple3", 12.09, Color.GREEN, "america");
4. Apple apple4 = new Apple("Apple4", 43.12, Color.Blue, "english");
5. Apple apple5 = new Apple("Apple5", 12.09, Color.GREEN, "oss");
6. Apple apple6 = new Apple("Apple6", 12.09, Color.GREEN, "fsd");
7. Apple apple7 = new Apple("Apple7", 12.09, Color.Blue, "fa");
8. Apple apple8 = new Apple("Apple8", 12.09, Color.Blue, "as");
9. Apple apple9 = new Apple("Apple9", 10.232, Color.GREEN, "sfs");
10. Apple apple10 = new Apple("Apple10", 43.22, Color.RED, "zz");
11. List<Apple> appleList = Arrays.asList(apple1, apple2, apple3, apple4, apple5, apple6, apple7, apple8, apple9, apple10);

案例1:按照重量排序,重量一样时候按照城市排序

list.sort(Comparator.comparing(Apple::getWeight).thenComparing(Apple::getNation));

案例2:筛选要么是重量大于23的红苹果,要么是绿苹果的集合

1. // 方式一
2. Predicate<Apple> predicate = apple -> Color.RED.equals(apple.getColor());
3. list.stream().filter(predicate.and(a -> a.getWeight() > 23).or(b -> b.getColor().equals(Color.GREEN))).forEach(System.out::println);
4. // 方式二
5. list.stream().filter(apple -> Color.RED.equals(apple.getColor()) && apple.getWeight() > 23 || Color.GREEN.equals(apple.getColor())).forEach(System.out::println);

案例3:挑选重量小于30的苹果,然后按照城市名字排序,并把名字打印出来

list.stream().filter(apple -> apple.getWeight() < 30).map(Apple::getNation).sorted().forEach(System.out::println);

案例4:筛选前二个红苹果

appleList.stream().filter(apple -> Color.RED.equals(apple.getColor())).limit(2).forEach(System.out::println);

案例5:筛选除了前两个的其他所有红苹果

appleList.stream().filter(apple -> Color.RED.equals(apple.getColor())).skip(2).forEach(System.out::println);

案例6:遍历所有每个苹果所在城市名字的长度

appleList.stream().map(apple -> apple.getNation().length()).forEach(System.out::println);

案例7:找到任意一个红苹果(第一个、是否全是红,是否有一个红色,是否没有红)

1. // 任意一个红苹果
2. appleList.stream().filter(apple -> Color.RED.equals(apple.getColor())).findAny().ifPresent(System.out::println);
3. // 第一个红苹果
4. Optional<Apple> first = appleList.stream().filter(apple -> Color.RED.equals(apple.getColor())).findFirst();
5. System.out.println(first.orElse(new Apple("11", 23, Color.RED, "lalalla")));
6. // 是否全是红
7. System.out.println(appleList.stream().allMatch(apple -> Color.RED.equals(apple.getColor())));
8. // 是否有红
9. System.out.println(appleList.stream().anyMatch(apple -> Color.RED.equals(apple.getColor())));
10. // 是否没有红
11. System.out.println(appleList.stream().noneMatch(apple -> Color.RED.equals(apple.getColor())));

案例8:计算所有苹果的重量和

1. // 方式一
2. System.out.println(appleList.stream().mapToDouble(Apple::getWeight).reduce(0.00, (a, b) ->
3. // 为了防止小数位过多
4. new BigDecimal(Double.toString(a)).add(new BigDecimal(Double.toString(b))).doubleValue()
5. ));
6. // 方式二
7. System.out.println(appleList.stream().mapToDouble(Apple::getWeight).sum());

案例9:找出最重的苹果

1. // 方式一
2. appleList.stream().map(Apple::getWeight).reduce(Double::max).ifPresent(System.out::println);
3. // 方式二
4. appleList.stream().max(Comparator.comparingDouble(Apple::getWeight)).ifPresent(apple -> System.out.println(apple.getWeight()));
5. // 方式三
6. appleList.stream().mapToDouble(Apple::getWeight).max().ifPresent(System.out::println);

案例10:返回所有的城市名字字符串,按照城市名字排序

1. System.out.println(appleList.stream().map(Apple::getNation)
2.         .distinct()
3.         .sorted()
4. // 效率不高
5. //.reduce("", (a, b) -> a + b));
6.         .collect(Collectors.joining(",")));

案例11:求出平均重量

1. // 方式一
2. appleList.stream().mapToDouble(Apple::getWeight).average().ifPresent(System.out::println);
3. // 方式二
4. System.out.println(appleList.stream().collect(Collectors.averagingDouble(Apple::getWeight)));

案例12:按照苹果颜色分组,颜色一样按照重量分组

Map<Color, Map<Double, List<Apple>>> collect = appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.groupingBy(Apple::getWeight)));

案例13:按照颜色分组,并且显示每种颜色分组后的数量

1. Map<Color, Long> collect = appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.counting()));
2. collect.entrySet().forEach(System.out::println);
3. // 补充,假如挑选所要结果后大于3的
4. collect.entrySet().stream().filter(colorLongEntry -> colorLongEntry.getValue() > 3).forEach(System.out::println);

案例14:按颜色分组,挑选出每个分组中重量最大的,重量一样的话,根据城市名字

1. Map<Color, Optional<Apple>> collect = appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.maxBy(Comparator.comparingDouble(Apple::getWeight).thenComparing(Apple::getNation))));
2. // 去掉optional
3. Map<Color, Apple> collect1 = collect.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, colorOptionalEntry -> colorOptionalEntry.getValue().orElse(new Apple()), (a, b) -> a));
4. System.out.println(collect1);
5. // 方式二
6. //Map<Color, Apple> collect3 = appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingDouble(Apple::getWeight).thenComparing(Apple::getNation)), Optional::get)));
7. Map<Color, Apple> collect2 = appleList.stream().collect(Collectors.toMap(Apple::getColor, Function.identity(), BinaryOperator.maxBy(Comparator.comparingDouble(Apple::getWeight).thenComparing((Apple::getNation)))));
8. System.out.println("-----------------------------");
9. System.out.println(collect2);

案例15:同时找出苹果的总数量,最大值,最小值,平均值

1. DoubleSummaryStatistics collect = appleList.stream().collect(Collectors.summarizingDouble(Apple::getWeight));
2. System.out.println(collect);

案例16:按照颜色分组,找出每个分组下的最大值,总数。最小值,平均值

1. Map<Color, DoubleSummaryStatistics> collect1 = appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.summarizingDouble(Apple::getWeight)));
2. collect1.entrySet().forEach(System.out::println);

案例17:重量大于20的分为一组,重量小于20的分为一组

1. // 方式一
2.  Map<Boolean, List<Apple>> collect = appleList.stream().collect(Collectors.groupingBy(a -> a.getWeight() > 20));
3.  collect.forEach((aBoolean, apples) -> System.out.println(aBoolean + apples.toString()));
4. // 方式二
5.  Map<Boolean, List<Apple>> collect1 = appleList.stream().collect(Collectors.partitioningBy(apple -> apple.getWeight() > 20));
6.  collect1.forEach((aBoolean, apples) -> System.out.println(aBoolean + apples.toString()));

案例18:基于案例17,每种分组再按照颜色分组

1. Map<Boolean, Map<Color, List<Apple>>> collect = appleList.stream().collect(Collectors.partitioningBy(apple -> apple.getWeight() > 20, Collectors.groupingBy(Apple::getColor)));
2. System.out.println(collect);

案例19:重量大于20的分为一组,重量小于20的分为一组,只要分组的重量最大的

Map<Boolean, Apple> collect = appleList.stream().collect(Collectors.partitioningBy(apple -> apple.getWeight() > 20, Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingDouble(Apple::getWeight)), Optional::get)));

案例20:按照重量大于20的一组,小于20的一组,找出每组个数

Map<Boolean, Long> collect = appleList.stream().collect(Collectors.partitioningBy(apple -> apple.getWeight() > 20, Collectors.counting()));

案例21:先根据重量是否大于20分组,再根据颜色是否为红色分组

Map<Boolean, Map<Boolean, List<Apple>>> collect = appleList.stream().collect(Collectors.partitioningBy(apple -> apple.getWeight() > 20, Collectors.partitioningBy(apple -> apple.getColor().equals(Color.RED))));

案例22:根据名字降序排序,为null的在最后

appleList.sort(Comparator.comparing(Apple::getName,Comparator.nullsLast(Comparator.reverseOrder())));

扩充知识:

1. public static void main(String[] args) {
2. // 生成1-100的偶数流
3. //test1();
4. // 生成1-100内的勾股数
5. //test2();
6. // iterate打印10个偶数
7. //test3();
8. // 生成10个斐波那契数列
9. //test4();
10. //生成随机数或者全是1的无限流
11. //test5();
12.     }
13. public static void test1(){
14. // 打印个数(注意,rangeClosed包括两端,range不包括右端点)
15.       IntStream.rangeClosed(1, 100).filter(value -> value % 2 == 0).forEach(System.out::println);
16.     }
17. public static void test2(){
18.         IntStream.rangeClosed(1,100).boxed().flatMap(
19.                 a->IntStream.rangeClosed(a,100).mapToObj(b->new double[]{a,b,Math.sqrt(a*a+b*b)})
20.         ).filter(t->t[2]%1==0).forEach(result->System.out.println(result[0]+""+result[1]+result[2]));
21.     }
22. public static void test3(){
23.         Stream.iterate(0,a->a+2).limit(10).forEach(System.out::println);
24.     }
25. public static void test4(){
26.         Stream.iterate(new int[]{0,1},a->new int[]{a[1],a[0]+a[1]}).limit(10).forEach(result-> System.out.println(result[0]));
27.     }
28. public static void test5(){
29. // 生成随机数
30.         Stream.generate(Math::random).limit(20).forEach(System.out::println);
31. // 生成全是1的无限流
32.         Stream.generate(()->1).limit(20).forEach(System.out::println);
33.     }
34. }


目录
相关文章
|
3天前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
12 4
|
4天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
5天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
21 2
|
11天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
31 2
|
16天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
13天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
12天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
12天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
8 0
|
SQL 存储 前端开发
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!
140 0
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!
|
Java 程序员 API
Java 8 Stream API学习总结
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
1032 0
下一篇
无影云桌面