java流已关闭

hk8txs48  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(294)

我想使用stream getfirst方法两次,但是出现了一个错误(java.lang.illegalstateexception:stream已经被操作或关闭),这个流代码从这里命名的注解开始。

//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();

            }       
        }
    }
arknldoa

arknldoa1#

Stream.findFirst 是终端操作调用 findFirst 像你这样在同一条流上做两次是不可能的。
看起来您不需要调用它两次:即使您重新启动了一个新的流,两次您都希望得到相同的Map条目。所以打电话 findFirst 只能使用一次,并使用它返回给您的可选选项:

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());
z2acfund

z2acfund2#

一条流不能用两次。创建一个变量来保存 findFirst()

nbnkbykc

nbnkbykc3#

sort2 没有为你做任何事,只是隐藏了你不能重用的问题 sorted .
在这种情况下,到目前为止最好的解决方案是存储 sorted.findFirst() 并重用它而不是调用 findFirst() 两次。如果你想这样做,那你就得写

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

…这会对条目进行两次排序,效率很低。

相关问题