Java 8 Stream Demo
Project 数据初始化类
1 | package com.smobob.java8.stream; |
Java8 VS Java7
Java 7
1 | List<Project> result = new ArrayList<>(); |
Java 8
1 | List<Project> projects = Project.buildData(); |
创建 Stream 流
集合
1 | List<String> list = Arrays.asList("hello", "world"); |
数组
1 | Stream<String> stringStream = Arrays.stream(new String[]{"hello", "world"}); |
值
1 | Stream<String> stream1 = Stream.of("hello", "world"); |
文件
1 | try (Stream lines = Files.lines(Paths.get(“文件路径名”), Charset.defaultCharset())) { |
iterator
1 | Stream.iterate(0, n -> n + 2).limit(10).forEach(System.out::println); |
使用 Stream 流
filter 筛选
1 | List<Project> projects = Project.buildData(); |
distinct 去重
1 | // 使用 distinct 去重 |
limit 截取
1 | // 使用 distinct 去重,limit取前 3 条记录 |
skip 跳过
1 | // 使用 skip 跳过流的前 n 个元素 |
map 映射
1 | List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action"); |
flatMap 合并多个流
1 | // 列出List中各不相同的单词 |
anyMatch 是否匹配任一元素
1 | List<Project> projects = Project.buildData(); |
allMatch 是否匹配所有元素
1 | List<Project> projects = Project.buildData(); |
noneMatch 是否未匹配所有元素
1 | List<Project> projects = Project.buildData(); |
findAny 获取任一元素
1 | Project project = projects.stream().findAny().get(); |
findFirst 获取第一个元素
1 | Project project = projects.stream().findFirst().get(); |
reduce 归约
1 | List<Integer> numbers = Arrays.asList(2, 4, 5, 6); |
数值流
1 | // IntStream、DoubleStream、LongStream 数值流 |
Collector 收集
Collectors.counting 计数
1 | List<Project> projects = Project.buildData(); |
Collectors.maxBy 最值
1 | // 按照作者名称筛选出每组star最高的项目 |
Collectors.summingInt 求和
1 | List<Project> projects = Project.buildData(); |
Collectors.averagingInt 求平均值
1 | List<Project> projects = Project.buildData(); |
Collectors.joining 连接字符串
1 | System.out.println(Stream.of("Hello", "Java8").collect(joining(","))); |
Collectors.reducing 一般归约
1 | List<Project> projects = Project.buildData(); |
汇总
Collectors 类的静态工厂方法
工厂方法 | 返回类型 | 用途 | 示例 |
---|---|---|---|
toList | List |
把流中所有项目收集到一个 List | List |
toSet | Set |
把流中所有项目收集到一个 Set,删除重复项 | Set |
toCollection | Collection |
把流中所有项目收集到给定的供应源创建的集合 | Collection |
counting | Long | 计算流中元素的个数 | long howManyProjects = projectStream.collect(counting()); |
summingInt | Integer | 对流中项目的一个整数属性求和 | int totalStars = projectStream.collect(summingInt(Project::getStars)); |
averagingInt | Double | 计算流中项目 Integer 属性的平均值 | double avgStars = projectStream.collect(averagingInt(Project::getStars)); |
summarizingInt | IntSummaryStatistics | 收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值 | IntSummaryStatistics projectStatistics = projectStream.collect(summarizingInt(Project::getStars)); |
joining | String | 连接对流中每个项目调用 toString 方法所生成的字符串 | String shortProject = projectStream.map(Project::getName).collect(joining(“, “)); |
maxBy | Optional |
按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty() | Optional |
minBy | Optional |
按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty() | Optional |
reducing | 归约操作产生的类型 | 从一个作为累加器的初始值开始,利用 BinaryOperator 与流中的元素逐个结合,从而将流归约为单个值 | int totalStars = projectStream.collect(reducing(0, Project::getStars, Integer::sum)); |
collectingAndThen | 转换函数返回的类型 | 包含另一个收集器,对其结果应用转换函数 | int howManyProjects = projectStream.collect(collectingAndThen(toList(), List::size)); |
groupingBy | Map<K, List |
根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键 | Map<String,List |
partitioningBy | Map<Boolean,List |
根据对流中每个项目应用断言的结果来对项目进行分区 | Map<Boolean,List |
分组
1 | // 根据作者名进行分组 |
多级分组
1 | // 根据编程语言类型做前后端分组 |
转换类型
1 | List<Project> projects = Project.buildData(); |
数据分区
1 | public class Example { |
并行流
1 | int max = 1000000; |