- package com.javanew;
- import com.javanew.model.Department;
- import com.javanew.model.Users;
- import java.util. * ;
- import java.util.stream.Collectors;
- /**
- * Java 8 API 添加了一个新的抽象称为流 Stream, 可以让你以一种声明的方式处理数据.
- * <p>
- * Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象.
- * <p>
- * Stream API 可以极大提高 Java 程序员的生产力, 让程序员写出高效率, 干净, 简洁的代码.
- * <p>
- * 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序, 聚合等.
- */
- public class StreamTest {
- public static void main(String[] args) {
- System.out.println("========== 生成流 ===============");
- /**
- * 生成流
- * 在 Java 8 中, 集合接口有两个方法来生成流:
- *
- * stream() − 为集合创建串行流.
- *
- * parallelStream() − 为集合创建并行流.
- */
- List < String > strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
- strings.forEach(s - >System.out.println(s));
- List < String > filtered = strings.stream().filter(string - >!string.isEmpty()).collect(Collectors.toList());
- filtered.forEach(s - >System.out.println(s));
- System.out.println("============forEach=============");
- /**
- * forEach
- * Stream 提供了新的方法'forEach' 来迭代流中的每个数据. 以下代码片段使用 forEach 输出了 10 个随机数:
- */
- Random random = new Random();
- random.ints().limit(10).forEach(System.out: :println);
- System.out.println("============map=============");
- /**
- * map
- * map 方法用于映射每个元素到对应的结果, 以下代码片段使用 map 输出了元素对应的平方数:
- */
- List < Integer > numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
- // 获取对应的平方数
- List < Integer > collect = numbers.stream().map(i - >i * i).distinct().collect(Collectors.toList());
- collect.forEach(integer - >System.out.println(integer));
- System.out.println("============filter=============");
- /**
- * filter
- * filter 方法用于通过设置的条件过滤出元素. 以下代码片段使用 filter 方法过滤出空字符串:
- */
- List < String > strings1 = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
- // 获取空字符串的数量
- long count = strings1.stream().filter(s - >s.isEmpty()).count();
- System.out.println("空字符串的数量" + count);
- System.out.println("============limit=============");
- /**
- * limit
- * limit 方法用于获取指定数量的流. 以下代码片段使用 limit 方法打印出 10 条数据:
- */
- Random random1 = new Random();
- random1.ints().limit(10).forEach(System.out: :println);
- System.out.println("============sorted=============");
- /**
- * sorted
- * sorted 方法用于对流进行排序. 以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:
- */
- Random random2 = new Random();
- random2.ints().limit(10).sorted().forEach(System.out: :println);
- System.out.println("============ 并行 (parallel) 程序 =============");
- /**
- * 并行 (parallel) 程序
- * parallelStream 是流并行处理程序的代替方法. 以下实例我们使用 parallelStream 来输出空字符串的数量:
- */
- List < String > strings2 = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
- // 获取空字符串的数量
- Long count2 = strings.parallelStream().filter(string - >string.isEmpty()).count();
- System.out.println("并行 (parallel) 程序空字符串的数量" + count2);
- System.out.println("============Collectors=============");
- /**
- * Collectors
- * Collectors 类实现了很多归约操作, 例如将流转换成集合和聚合元素. Collectors 可用于返回列表或字符串:
- */
- List < String > strings3 = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
- List < String > filtered1 = strings3.stream().filter(s - >!s.isEmpty()).collect(Collectors.toList());
- System.out.println("筛选列表:" + filtered1);
- String mergedString = strings3.stream().filter(s - >!s.isEmpty()).collect(Collectors.joining(","));
- System.out.println("合并字符串:" + mergedString);
- System.out.println("============ 统计 =============");
- /**
- * 统计
- * 另外, 一些产生统计结果的收集器也非常有用. 它们主要用于 int,double,long 等基本类型上, 它们可以用来产生类似如下的统计结果.
- */
- List < Integer > numbers2 = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
- IntSummaryStatistics stats = numbers2.stream().mapToInt((x) - >x).summaryStatistics();
- System.out.println("列表中最大的数 :" + stats.getMax());
- System.out.println("列表中最小的数 :" + stats.getMin());
- System.out.println("所有数之和 :" + stats.getSum());
- System.out.println("平均数 :" + stats.getAverage());
- List < Users > list = new ArrayList < >();
- Department department = new Department();
- department.setDeptName("开发部");
- department.setDeptNo(001);
- Users users1 = new Users();
- users1.setName("aaa");
- users1.setMoney(100);
- users1.setDepartment(Arrays.asList(department));
- Users users2 = new Users();
- users2.setName("bbb");
- users2.setMoney(300);
- users2.setDepartment(Arrays.asList(department));
- list.add(users1);
- list.add(users2);
- List < Integer > collect1 = list.stream().map(users - >users.getMoney()).collect(Collectors.toList());
- List < Integer > collect2 = list.stream().map(Users: :getMoney).collect(Collectors.toList());
- //Users 对象名字的集合
- List < String > names = list.stream().map(users - >users.getName()).collect(Collectors.toList());
- //Users 对象 money 的求和
- int sum = list.stream().mapToInt(Users: :getMoney).sum();
- // 获取 List 对象中 money 最多的一个人
- Users users3 = list.stream().max(Comparator.comparing(users - >users.getMoney())).get();
- // 获取 List 对象中 money 最少的一个人
- Users users4 = list.stream().min(Comparator.comparing(users - >users.getMoney())).get();
- // 获取名字为 xxx 的 user
- List < Users > collect3 = list.stream().filter(users - >"xxx".equals(users.getName())).collect(Collectors.toList());
- //List 集合去重
- List < Users > collect4 = list.stream().distinct().collect(Collectors.toList());
- //List 按照 money 从小到大排序(顺序)
- List < Users > collect5 = list.stream().sorted(Comparator.comparing(Users: :getMoney)).collect(Collectors.toList());
- //List 按照 money 从大到小排序(倒序)
- List < Users > collect6 = list.stream().sorted(Comparator.comparing(Users: :getMoney).reversed()).collect(Collectors.toList());
- //List 集合按照名字进行分组
- Map < String,
- List < Users >> collect7 = list.stream().collect(Collectors.groupingBy(Users: :getName));
- // 获取 List 集合 user 对象的所有部门编号
- List < Integer > deptNos = new ArrayList < >();
- list.stream().forEach(users - >deptNos.addAll(users.getDepartment().stream().map(Department: :getDeptNo).distinct().collect(Collectors.toList())));
- // 判断 list 集合中所有 user 的 money 是否都是 100, 是就返回 true, 否则返回 false
- boolean allMatch1 = list.stream().allMatch(users - >users.getMoney() == 100);
- // 判断 list 集合中所有 user 名字为 aaa 的所有 user 的 money 是否都是 100, 是就返回 true, 否则返回 false
- boolean allMatch = list.stream().filter(users - >users.getName().equals("aaa")).allMatch(users - >users.getMoney() == 100);
- // 在 list 集合数量大时才有并行流处理 parallelStream
- /**
- * stream or parallelStream?
- * 1. 是否需要并行?
- * 2. 任务之间是否是独立的? 是否会引起任何竞态条件?
- * 3. 结果是否取决于任务的调用顺序?
- */
- boolean allMatch2 = list.parallelStream().filter(users - >users.getName().equals("aaa")).allMatch(users - >users.getMoney() == 100);
- System.out.println("allMatch1->:" + allMatch1);
- System.out.println("allMatch->" + allMatch);
- System.out.println("collect1 输出");
- collect1.forEach(System.out: :println);
- System.out.println("collect2 输出");
- collect2.forEach(i - >System.out.println(i));
- LongSummaryStatistics statistics = collect1.stream().mapToLong((x) - >x).summaryStatistics();
- System.out.println("列表中最大的数 :" + statistics.getMax());
- System.out.println("列表中最小的数 :" + statistics.getMin());
- System.out.println("所有数之和 :" + statistics.getSum());
- System.out.println("平均数 :" + statistics.getAverage());
- }
- }
来源: http://www.bubuko.com/infodetail-3136324.html