使用

map/flatMap

map

map,它的作用就是把inputStream的每个元素映射成outputStream的另外一个元素

map生成的是个1:1映射

1
2
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
List<Integer> squareNums = nums.stream().map(n -> n * n).collect(Collectors.toList());

flatMap

flatMap把inputStream中的层级结构 扁平化,就是将最底层元素抽出来放到一起,最终output的新Stream里面已经没有List了,都是直接的数字

1
2
3
4
5
6
7
Stream<List<Integer>> inputStream = Stream.of(
Arrays.asList(1),
Arrays.asList(2, 3),
Arrays.asList(4, 5, 6)
);
Stream<Integer> outputStream = inputStream.
flatMap((childList) -> childList.stream());

filter

filter对原始Stream进行某项测试,通过测试的元素被留下来生成一个新Stream。

1
2
3
4
// 留下偶数
Integer[] sixNums = {1, 2, 3, 4, 5, 6};
Integer[] evens =
Stream.of(sixNums).filter(n -> n%2 == 0).toArray(Integer[]::new);

forEach

循环,terminal操作

1
2
umsAdmins.stream().filter(n -> n.getStatus() == 1).forEach(n -> System.out.println(n.getUsername()));

forEach是terminal操作。因此,它执行后,Stream 的元素就被“消费”掉了,你无法对一个Stream进行两次terminal运算。下面的代码是错误的

1
2
stream.forEach(element -> doOneThing(element));
stream.forEach(element -> doAnotherThing(element));

findFirst

这是一个termimal兼short-circuiting操作,它总是返回Stream的第一个元素或者空。

1
2
3
4
5
6
Stream<UmsAdmin> stream = umsAdmins.stream();
Optional<UmsAdmin> first = stream.findFirst();
UmsAdmin umsAdmin3 = first.get();
System.out.println(umsAdmin3);
String integer = Optional.ofNullable(umsAdmin3.getPassword()).map(n -> n).orElse(String.valueOf(-1));
System.out.println(integer);

findFirst 返回的是Optional

引用

StreamApi 的背景及使用