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)
}我们可以通过下面图来增加理解,如下图:
