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)); }