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. }


目录
相关文章
|
6天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
6天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
18 2
|
6天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
14 2
|
8天前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
20 4
|
10天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
11天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
32 2
|
14天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
47 3
|
16天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
33 2
|
17天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
35 2
|
17天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
12 2