【问题标题】:java stream is closedjava流已关闭
【发布时间】:2020-08-19 02:59:01
【问题描述】:

我想使用流 getfirst 方法两次,但发生错误说(java.lang.IllegalStateException:流已被操作或关闭)并且此流代码从此处命名的注释开始。

                //code
                Stream<Map.Entry<String,Integer>> sorted =
                        map.entrySet().stream()
                           .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
                
                Supplier<Stream<Map.Entry<String,Integer>>>  sort2 = () -> sorted;
                Optional<String> kk = Optional.of(sort2.get().findFirst().get().getKey());
                Optional<Integer> vv = Optional.of(sort2.get().findFirst().get().getValue());
                int vmax = vv.get().intValue() ;    
                int count=0;
                ArrayList<String> a = new ArrayList<String>() ;
                for(Map.Entry<String,Integer> h: map.entrySet() ) {
                    if(h.getValue()==vmax) {
                        a.add(h.getKey()) ;
                        count++;
                    }
                }
                
                if(count>1) {
                    Collections.sort(a);
                    System.out.println(a.get(0));
                    
                }
                else {
                    System.out.println(kk.get());
                }    
                map.clear();
    
            }       
        }
    }
        
    
     

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    您不能两次使用流。创建一个变量来保存findFirst()的值

    【讨论】:

      【解决方案2】:

      sort2 没有为您做任何事情,只是隐藏了您无法重用sorted 的问题。

      在这种情况下,到目前为止,最好的解决方案是将sorted.findFirst() 存储在一个变量中并重用它,而不是调用两次findFirst()。如果你想这样做,那么你将不得不写

      Supplier<Stream<Map.Entry<String,Integer>>> sort2 = () ->  map.entrySet().stream()
         .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
      

      ...这将对条目进行两次排序,这将非常低效。

      【讨论】:

        【解决方案3】:

        Stream.findFirst 是一个终端操作 - 不可能像你一样在同一个流上调用findFirst 两次。

        看起来您不需要调用它两次:即使您重新启动了一个新流,两次您都希望获得相同的映射条目。所以只调用一次findFirst,然后使用它返回给你的 Optional:

        Optional<Map.Entry<String, Integer>> firstEntry = sorted.findFirst();
        Optional<String> kk = firstEntry.map(Map.Entry::getKey);
        Optional<Integer> vv = firstEntry.map(Map.Entry::getValue);
        

        请注意,从流中获取最大项目比排序更好的方法:使用 max 运算符。

        Optional<Map.Entry<String, Integer>> maxEntry = map.entrySet().stream()
            .max(Map.Entry.comparingByValue());
        

        【讨论】:

          猜你喜欢
          • 2014-05-18
          • 1970-01-01
          • 2013-10-12
          • 1970-01-01
          • 2016-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多