Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 流可选<;问题>;使用查找得分最高的问题_Java_Foreach_Java Stream_Optional - Fatal编程技术网

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