Java 8 急切地获取中间流操作的结果

2024-02-01

给出以下代码:

List<String> list = Arrays.asList("a", "b", "c");
        list.stream()
        .map(s -> s + "-" + s)                 //"a-a", "b-b", "c-c"
        .filter(s -> !s.equals("b-b"))         //"a-a", "c-c"
        .forEach(s -> System.out.println(s));

map and filter是中间操作和forEach是终端操作。只有执行完终端操作后才能得到数据转换的结果。

有什么办法可以force评价更加渴望并且有某种中间结果- 不破坏流操作链?例如,我想要“a-a”、“b-b”、“c-c”列表(这将是第一个中间操作的结果)。


您可以使用peek https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer-:

List<String> allPairs = new ArrayList<>();
List<String> list = Arrays.asList("a", "b", "c");
    list.stream()
    .map(s -> s + "-" + s)                 //"a-a", "b-b", "c-c"
    .peek(allPairs::add)
    .filter(s -> !s.equals("b-b"))         //"a-a", "c-c"
    .forEach(s -> System.out.println(s));

这样,计算仍然不会开始,直到终端操作,但您可以在任何时候“拦截”流内容并以您喜欢的任何方式使用它。

但是要小心,如果你的终端操作是短路的(比如findFirst): 这样并不是所有的元素都会被传递到peek.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 急切地获取中间流操作的结果 的相关文章

随机推荐