我想使用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();
}
}
}
3条答案
按热度按时间arknldoa1#
Stream.findFirst
是终端操作调用findFirst
像你这样在同一条流上做两次是不可能的。看起来您不需要调用它两次:即使您重新启动了一个新的流,两次您都希望得到相同的Map条目。所以打电话
findFirst
只能使用一次,并使用它返回给您的可选选项:请注意,从流中获取最大项的方法比排序更好:使用
max
接线员。z2acfund2#
一条流不能用两次。创建一个变量来保存
findFirst()
nbnkbykc3#
sort2
没有为你做任何事,只是隐藏了你不能重用的问题sorted
.在这种情况下,到目前为止最好的解决方案是存储
sorted.findFirst()
并重用它而不是调用findFirst()
两次。如果你想这样做,那你就得写…这会对条目进行两次排序,效率很低。