Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。
Stream示例:
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "a", "a", "b", "c", "d");
// 创建流
Stream<String> stream = list.stream();
// 中间操作
// 一、( 刷选和切片)
// 1.filter排除过滤
Stream<String> tmp1 = stream.filter((x) -> {
return x.equals("a");
});
// 终止操作
tmp1.forEach(System.out::println);
tmp1.close();
// 2.limit限制数量
stream = list.stream();
Stream<String> tmp2 = stream.limit(2);
// 终止操作
tmp2.forEach(System.out::println);
tmp2.close();
// 3.skip跳过元素
stream = list.stream();
Stream<String> tmp3 = stream.skip(3);
// 终止操作
tmp3.forEach(System.out::println);
tmp3.close();
// 3.distinct去除重复数据
stream = list.stream();
Stream<String> tmp4 = stream.distinct();
// 终止操作
tmp4.forEach(System.out::println);
tmp4.close();
stream.close();
// 二、映射
// 1.map——接收Lambda,将元素转换成其他形式的提取发
// 1.map— 接收一个函数作为参数,该参数会应用到每一个元素上,并将其映射为一个新的元素。
System.out.println("------------------------------------------");
Stream<String> tmp5 = list.stream();
tmp5.map((x) -> x.toUpperCase()).forEach(System.out::println);
// 2.flatMap——接收一个函数作为参数,将流中的每一个值都转换成一个流,并将所有的流合并成一个流。
// 如:{{a,b},{c,d},{e,f}}=>{a,b,c,d,e,f}
// tmp5.flatMap((x) -> {
// return null;
// });
// 3、排序
System.out.println("------------------------------------------");
Stream<String> tmp6 = list.stream();
tmp6.sorted((x, y) -> {
return x.compareTo(y);
}).forEach(System.out::println);
tmp6.close();
// 4.匹配
Stream<String> tmp7 = list.stream();
boolean isMath = tmp7.allMatch((x) -> x.equals("a"));
tmp7 = list.stream();
isMath = tmp7.anyMatch((x) -> x.equals("a"));
System.out.println(isMath);
tmp7 = list.stream();
// 总数
long count = tmp7.count();
System.out.println(count);
// 三、规约(可以将流中元素结合,如:累加)
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> tmp8 = intList.stream();
int sum = tmp8.reduce(0, (x, y) -> x + y);
System.out.println(sum);
// 四、收集(接收一个Collector接口的实现,将stream中的元素汇总成一个类型数据)
List<Integer> cList = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> tmp9 = cList.stream();
Set<Integer> set = tmp9.collect(Collectors.toSet());
set.forEach(System.out::println);
// 分组,根据条件分组
Stream<Integer> tmp10 = Arrays.asList(1, 1, 2, 3, 5).stream();
Map<Integer, List<Integer>> groupMap = tmp10.collect(Collectors.groupingBy((x) -> x));
}