示例三:求和
// 求和, 无起始值 int sumValue = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get(); System.out.println("有无起始值求和:" + sumValue); // 求和, 有起始值 sumValue = Stream.of(1, 2, 3, 4).reduce(1, Integer::sum); System.out.println("有起始值求和:" + sumValue); // 有无起始值求和:10 // 有起始值求和:11示例四:过滤拼接
concat = Stream.of("a", "B", "c", "D", "e", "F").filter(x -> x.compareTo("Z") > 0).reduce("", String::concat); System.out.println("过滤和字符串连接:" + concat); //过滤和字符串连接:ace13.Stream流的iterate使用
iterate 跟 reduce 操作很像,接受一个种子值,和一个UnaryOperator(例如 f)。 然后种子值成为 Stream 的第一个元素,f(seed) 为第二个,f(f(seed)) 第三个,以此类推。 在 iterate 时候管道必须有 limit 这样的操作来限制 Stream 大小。
示例:生成一个等差队列
System.out.println("从2开始生成一个等差队列:"); Stream.iterate(2, n -> n + 2).limit(5).forEach(x -> System.out.print(x + " ")); // 从2开始生成一个等差队列: // 2 4 6 8 1014.Stream流的Supplier使用
通过实现Supplier类的方法可以自定义流计算规则。
示例:随机获取两条用户信息
System.out.println("自定义一个流进行计算输出:"); Stream.generate(new UserSupplier()).limit(2).forEach(u -> System.out.println(u.getId() + ", " + u.getName())); //第一次: //自定义一个流进行计算输出: //10, pancm7 //11, pancm6 //第二次: //自定义一个流进行计算输出: //10, pancm4 //11, pancm2 //第三次: //自定义一个流进行计算输出: //10, pancm4 //11, pancm8 class UserSupplier implements Supplier<User> { private int index = 10; private Random random = new Random(); @Override public User get() { return new User(index++, "pancm" + random.nextInt(10)); } }15.Stream流的groupingBy/partitioningBy使用
groupingBy:分组排序;
partitioningBy:分区排序。
示例一:分组排序
System.out.println("通过id进行分组排序:"); Map<Integer, List<User>> personGroups = Stream.generate(new UserSupplier2()).limit(5) .collect(Collectors.groupingBy(User::getId)); Iterator it = personGroups.entrySet().iterator(); while (it.hasNext()) { Map.Entry<Integer, List<User>> persons = (Map.Entry) it.next(); System.out.println("id " + persons.getKey() + " = " + persons.getValue()); } // 通过id进行分组排序: // id 10 = [{"id":10,"name":"pancm1"}] // id 11 = [{"id":11,"name":"pancm3"}, {"id":11,"name":"pancm6"}, {"id":11,"name":"pancm4"}, {"id":11,"name":"pancm7"}] class UserSupplier2 implements Supplier<User> { private int index = 10; private Random random = new Random(); @Override public User get() { return new User(index % 2 == 0 ? index++ : index, "pancm" + random.nextInt(10)); } }示例二:分区排序
System.out.println("通过年龄进行分区排序:"); Map<Boolean, List<User>> children = Stream.generate(new UserSupplier3()).limit(5) .collect(Collectors.partitioningBy(p -> p.getId() < 18)); System.out.println("小孩: " + children.get(true)); System.out.println("成年人: " + children.get(false)); // 通过年龄进行分区排序: // 小孩: [{"id":16,"name":"pancm7"}, {"id":17,"name":"pancm2"}] // 成年人: [{"id":18,"name":"pancm4"}, {"id":19,"name":"pancm9"}, {"id":20,"name":"pancm6"}] class UserSupplier3 implements Supplier<User> { private int index = 16; private Random random = new Random(); @Override public User get() { return new User(index++, "pancm" + random.nextInt(10)); } }16.Stream流的summaryStatistics使用
IntSummaryStatistics 用于收集统计信息(如count、min、max、sum和average)的状态对象。
示例:得到最大、最小、之和以及平均数。
List<Integer> numbers = Arrays.asList(1, 5, 7, 3, 9); IntSummaryStatistics stats = numbers.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()); // 列表中最大的数 : 9 // 列表中最小的数 : 1 // 所有数之和 : 25 // 平均数 : 5.0Stream 介绍就到这里了,JDK1.8中的Stream流其实还有很多很多用法,更多的用法则需要大家去查看JDK1.8的API文档了。
LocalDateTime 介绍