Java 流可选<;问题>;使用查找得分最高的问题
/大家好!我真的很难用这种方法。我必须找出得分最高的问题,并用最少的视图进行过滤Java 流可选<;问题>;使用查找得分最高的问题,java,foreach,java-stream,optional,Java,Foreach,Java Stream,Optional,/大家好!我真的很难用这种方法。我必须找出得分最高的问题,并用最少的视图进行过滤 publicstream(){ Stream questionStream=Arrays.Stream(项目); forEach(System.out::println); 回流; } 公共可选findHighestScoringQuestionWith(int minimumViews){ 返回流() .排序(比较器.比较(问题::getScore)) .filter(x->x.getViewCount()>=最
publicstream(){
Stream questionStream=Arrays.Stream(项目);
forEach(System.out::println);
回流;
}
公共可选findHighestScoringQuestionWith(int minimumViews){
返回流()
.排序(比较器.比较(问题::getScore))
.filter(x->x.getViewCount()>=最小视图)
.findFirst();
}
//如果有人能帮我解决这个问题,我将不胜感激。我提前感谢大家
//我的例外
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.base/java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
at java.base/java.util.stream.ReferencePipeline.<init>(ReferencePipeline.java:94)
at java.base/java.util.stream.ReferencePipeline$StatefulOp.<init>(ReferencePipeline.java:725)
at java.base/java.util.stream.SortedOps$OfRef.<init>(SortedOps.java:126)
at java.base/java.util.stream.SortedOps.makeRef(SortedOps.java:63)
at java.base/java.util.stream.ReferencePipeline.sorted(ReferencePipeline.java:463)
at stackoverflow.Data.sortedStream(Data.java:156)
at stackoverflow.Main.main(Main.java:14)
线程“main”java.lang.IllegalStateException中的异常:流已被操作或关闭
位于java.base/java.util.stream.AbstractPipeline。(AbstractPipeline.java:203)
位于java.base/java.util.stream.ReferencePipeline。(ReferencePipeline.java:94)
位于java.base/java.util.stream.ReferencePipeline$StatefulOp。(ReferencePipeline.java:725)
位于java.base/java.util.stream.SortedOps$OfRef.(SortedOps.java:126)
位于java.base/java.util.stream.SortedOps.makeRef(SortedOps.java:63)
位于java.base/java.util.stream.ReferencePipeline.sorted(ReferencePipeline.java:463)
在stackoverflow.Data.sortedStream(Data.java:156)中
位于stackoverflow.Main.Main(Main.java:14)
流是一次性对象,不能多次使用 问题是您正在stream()方法中调用
questionStream.forEach
,因此在返回之前它已经用完了。如果您确实想打印出内容,那么可以执行Arrays.asList(items).forEach(System.out::println)代码>
流操作分为中间操作和终端操作,并结合起来形成流管道。流管道由源(例如集合
、数组、生成器函数或I/O通道)组成;后跟零个或多个中间操作,如Stream.filter
或Stream.map
;以及诸如Stream.forEach
或Stream.reduce
之类的终端操作
-
Stream.forEach
是一个终端操作,意味着它完成了一个流管道。当调用终端操作时,将对整个流管道进行评估,如异常中所述,它已被操作
如果希望有多个终端操作,则需要设置多个流管道
要对数据中流执行某些操作,可以使用stream.peek
:
public Stream<Question> stream() {
Stream<Question> questionStream = Arrays.stream(items);
return questionStream.peek(System.out::println); // <-
}
public Optional<Question> findHighestScoringQuestionWith(int minimumViews){
return stream()
.sorted(Comparator.comparing(Question::getScore))
.filter(x -> x.getViewCount() >= minimumViews)
.findFirst();
}
publicstream(){
Stream questionStream=Arrays.Stream(项目);
return questionStream.peek(System.out::println);//x.getViewCount()>=minimumViews)
.findFirst();
}
这将打印出流中的所有项目,但仅在调用终端操作并对流进行评估后打印。在您的例子中,终端操作是findHighestScoringQuestionWith
方法中的Stream.findFirst
。您的Stream()
方法返回一个已经使用过的流。向我们展示您的Stream()
方法。但是,Stream().filter(x->x.getViewCount()>=minimumViews)。min(Comparator.Comparating(Question::getScore))
是一种更好的方法:您不需要排序来找到最小值,还可以说:“我必须找到得分最高的问题”您当前找到的问题得分较低(并且有足够的视图)。@huettl,请编辑您的问题并将代码片段放在那里。
public Stream<Question> stream() {
Stream<Question> questionStream = Arrays.stream(items);
return questionStream.peek(System.out::println); // <-
}
public Optional<Question> findHighestScoringQuestionWith(int minimumViews){
return stream()
.sorted(Comparator.comparing(Question::getScore))
.filter(x -> x.getViewCount() >= minimumViews)
.findFirst();
}