当前位置: 首页 > 知识库问答 >
问题:

如何重用java集合流的调用结果,这样我们就不会重复同样的工作了?

诸福
2023-03-14

我知道,一旦集合的流操作为forEach-min-collect-code,该流即关闭,不再适用于进一步的函数调用。

我的问题是,如何避免“重复流操作”,以便我们可以在同一个集合上执行不同的流操作,而不需要重复计算?

例如。

    public static void main(String[] args) {
        List<Integer> ls = new ArrayList<>(Arrays.asList( 11, 9, 7, 11, 24, 13, 37, 16 ));
        Stream<Integer> s1 = ls.stream().filter(x -> x > 10).sorted().distinct().limit(4).skip(2);
        s1.forEach(System.out::println);

        // java.lang.IllegalStateException: stream has already been operated upon or closed
        System.out.println(s1.max((x, y) -> x < y ? y : x).get()); // s1 is no longer useable.
    }

好吧,我知道为了得到s1。max我必须再次构建流,如下所示:

Stream<Integer> sAnother = ls.stream().filter(x -> x > 10).sorted().distinct().limit(4).skip(2);

这是可行的,但似乎是第二次做多余的工作。我希望我们可以使用这个调用序列,并使其只执行一次:

filter(x -> x > 10).sorted().distinct().limit(4).skip(2)

然后:(1)进行forEach打印元素。(2) 计算最大元素。

不必两次构造和计算整个流过程。

有办法做到这一点吗?谢谢。

共有1个答案

雍嘉勋
2023-03-14

Stream只能使用一次,您对此无能为力。但是,您可以做的是将其收集到Liststream.toList()),然后使用该列表进行进一步执行-在您的情况下创建两个可以执行不同工作的新流。

 类似资料:
  • 问题内容: 如果某些东西无法正常工作,或者某些插件未在我的Eclipse中正确加载,我通常会建议您以干净模式打开Eclipse。 那么,如何在干净模式下运行?如果我这样做会怎样? 问题答案: 它能做什么: 如果设置为“ true”,则OSGi框架和eclipse运行时使用的所有缓存数据都将被清除。这将清除用于存储捆绑包依赖关系解析和Eclipse扩展注册表数据的缓存。使用此选项将强制eclipse

  • 钱箱类: 商户类: 输入数据: 我的任务 计算每个商家的总金额并返回商家列表 我正在尝试使用Stream API解决这个任务。并编写了以下代码: 结果 但显然,流返回四个对象,而不是所需的两个对象。我意识到,地图(第二行)为每个cashBoxId创建了四个对象。而且我不知道如何通过进行过滤,也不知道如何获得没有重复的结果。

  • 所以,我使用的是过滤流。不幸的是,每次我打开它,5分钟后它就会关闭,但在这段时间里,它会捕捉推文。我想做的是保持24/7,这样5分钟后就不会关机。此外,如果它断开连接,我希望如此,它会再次尝试连接。 这是我用来帮助调整代码的代码示例: https://github.com/twitterdev/Twitter-API-v2-sample-code/blob/master/Filtered-Stre

  • 将浮点数转换为十进制数。例如,如果输入为12.345,则输出应为12345 ...所以这是我的解决方案: 我认为这个算法理论上是正确的,但实际上有些值对我不起作用!! 问题出在哪里,解决方案是什么,使我的程序正确工作?

  • 我在这个项目中使用了导航图,并添加了BottomNavigation。因此,有一个navhostfragment管理这些所有片段。如果有人帮我实现用viewpager来实现像在img(进来,在厨房)一样的tablayout。我是否必须使嵌套图,如果是,可以请你帮助我理解NavGraph。

  • 为什么编译器会抓狂?我应该能够修改返回的对象,如果java返回一个对象引用的权利?