Stream API
java.util.stream:其中包含用于处理元素序列的类
Stream
Stream Creation
stream() or of()
String[] arr = new String[]{"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);
stream = Stream.of("a", "b", "c");
Collection 接口中包含 stream() 方法,可用于创建 Stream
Stream<String> stream = list.stream();
Multi-threading with Streams
parallelStream() 方法,可以在并行情况下使用
list.parallelStream().forEach(element -> doWork(element));
Stream Operations
中间操作:返回 Stream,可以链接
终端操作:返回特定类型的结果
对流的操作不会改变源
long count = list.stream().distinct().count();
Iterating 迭代
for (String string : list) {
if (string.contains("a")) {
return true;
}
}
//等价于
boolean isExist = list.stream().anyMatch(element -> element.contains("a"));
Filtering 过滤
选择满足条件的元素流
ArrayList<String> list = new ArrayList<>();
list.add("One");
list.add("OneAndOnly");
list.add("Derek");
list.add("Change");
list.add("factory");
list.add("justBefore");
list.add("Italy");
list.add("Italy");
list.add("Thursday");
list.add("");
list.add("");
//所有包含“d”的元素流
Stream<String> stream = list.stream().filter(element -> element.contains("d"));
Mapping
对每一个元素进行操作,并生成一个新的stream
List<String> uris = new ArrayList<>();
uris.add("C:\\My.txt");
Stream<Path> stream = uris.stream().map(uri -> Paths.get(uri));
flatMap() 创建内部元素的流
List<Detail> details = new ArrayList<>();
details.add(new Detail());
Stream<String> stream = details.stream().flatMap(detail -> detail.getParts().stream());
Matching
boolean isValid = list.stream().anyMatch(element -> element.contains("h")); // true
boolean isValidOne = list.stream().allMatch(element -> element.contains("h")); // false
boolean isValidTwo = list.stream().noneMatch(element -> element.contains("h")); // false
Reduction
根据指定的函数将元素序列减少到某个值,方法含有两个参数,第一个是起始值,第二个是累加器函数。
List<Integer> integers = Arrays.asList(1, 1, 1);
Integer reduced = integers.stream().reduce(23, (a, b) -> a + b);
Collecting
将流转化为 Collection 或 Map
List<String> resultList = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList());