Java Stream API 提供了一种处理对象集合的函数式方法。Java 8 中添加了 Java Stream API 以及其他一些函数式编程功能。
Java Stream API 与 Java IO 中的 Java InputStream 和 Java OutputStream 无关。InputStream 和 OutputStream 与字节流有关。Java Stream API 用于处理对象流,而不是字节流。
Java Stream 是一种能够对其元素进行内部迭代的组件,这意味着它可以自行迭代其元素。相比之下,当您使用 Java 集合的迭代功能(例如 Java Iterator 或与 Java Iterable 一起使用的 Java for-each 循环)时,您必须自己实现元素的迭代。
示例:迭代一个 List,将 List 中的每个元素转换为大写字符。
package com.hxstrive.jdk8.stream_api; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 流定义 * @author hxstrive.com */ public class StreamDemo6 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("one"); list.add("two"); list.add("three"); // 传统迭代 for(String str : list) { System.out.println("common: " + str.toUpperCase()); } // 流迭代 list.stream().peek(e -> { System.out.println("stream: " + e.toLowerCase()); }).collect(Collectors.toList()); } // 输出结果: //common: ONE //common: TWO //common: THREE //stream: one //stream: two //stream: three }
您可以为流附加监听器。当流在内部迭代元素时,这些监听器会被调用。流中的每个元素都会被调用一次监听器。这样,每个监听器都能处理流中的每个元素。这就是所谓的流处理。
流的监听器形成一个链。链中的第一个监听器可以处理流中的元素,然后返回一个新元素供链中的下一个监听器处理。监听器可以返回相同的元素,也可以返回新的元素,这取决于该监听器(处理器)的目的是什么。
示例:使用流的方式处理列表,为列表的每个元素添加多个 map 监听器,如下:
package com.hxstrive.jdk8.stream_api; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 流定义 * @author hxstrive.com */ public class StreamDemo7 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("one"); list.add("two"); list.add("three"); // 定义多个监听器 List<String> newList = list.stream().map(e -> { // 第一个监听器,获取第一个字符 return "char[0]=" + e.charAt(0); }).map(e -> { // 第二个监听器,e为第一个监听器的返回结果 return "(" + e; }).map(e -> { // 第三个监听器,e为第二个监听器的返回结果 return e + ")"; }).collect(Collectors.toList()); for(String item : newList) { System.out.println(item); } } // 输出结果: //(char[0]=o) //(char[0]=t) //(char[0]=t) }
我们可以通过下面图来增加理解,如下图: