Java 记录过滤流的大小

Java 记录过滤流的大小,java,java-stream,Java,Java Stream,如果有超过1个结果未通过筛选,我希望此流引发异常。有没有办法做到这一点 一个想法是使用.count(),但我必须再次创建流 Optional<Result> filteredresultSet = results.stream() .filter(c -> c.equals("TOMATO)) .findAny(); 可选filteredresultSet=results.stream() .过滤器(c->c.equals(“番茄”) .fin

如果有超过1个结果未通过筛选,我希望此流引发异常。有没有办法做到这一点

一个想法是使用
.count()
,但我必须再次创建流

Optional<Result> filteredresultSet = results.stream()
        .filter(c -> c.equals("TOMATO))
        .findAny();
可选filteredresultSet=results.stream()
.过滤器(c->c.equals(“番茄”)
.findAny();

您可以用
reduce()
替换
findAny()
,并在累加器中引发异常:

Optional<String> filteredresultSet = results.stream()
                                            .filter("TOMATO"::equals)
                                            .reduce((s1, s2) -> {
                                                throw new MyException();
                                            });

这将返回
容器的一个实例,或者如果流为空,则返回
null
。然后,您可以检查
计数
,并返回
值的
可选

,您可以用
减少()
替换
findAny()
,并在累加器中引发异常:

Optional<String> filteredresultSet = results.stream()
                                            .filter("TOMATO"::equals)
                                            .reduce((s1, s2) -> {
                                                throw new MyException();
                                            });

这将返回
容器的一个实例,或者如果流为空,则返回
null
。然后,您可以检查
计数
,并返回
可选

一个简单的方法是使用
限制(2)
在流上进行两次匹配后短路,然后收集到列表或数组

List<Result> filtered = results.stream()
    .filter(c -> c.equals("TOMATO"))
    .limit(2)   // we don't need to know if there are more than 2 matches
    .collect(toList());

if (filtered.size() > 1) {
    // throw or log
}

return filtered.isEmpty() ? Optional.empty() : Optional.of(filtered.get(0));
List filtered=results.stream()
.filter(c->c.equals(“番茄”))
.limit(2)//我们不需要知道是否有超过2个匹配项
.collect(toList());
如果(筛选的.size()>1){
//投掷或记录
}
返回filtered.isEmpty()?Optional.empty():Optional.of(filtered.get(0));

一种简单的方法是使用
.limit(2)
在两次匹配后对流进行短路,然后收集到列表或数组中

List<Result> filtered = results.stream()
    .filter(c -> c.equals("TOMATO"))
    .limit(2)   // we don't need to know if there are more than 2 matches
    .collect(toList());

if (filtered.size() > 1) {
    // throw or log
}

return filtered.isEmpty() ? Optional.empty() : Optional.of(filtered.get(0));
List filtered=results.stream()
.filter(c->c.equals(“番茄”))
.limit(2)//我们不需要知道是否有超过2个匹配项
.collect(toList());
如果(筛选的.size()>1){
//投掷或记录
}
返回filtered.isEmpty()?Optional.empty():Optional.of(filtered.get(0));

第三方库可以接受吗?这听起来像是Guava的完美工作。是的!这完全有效!作为一个附带问题,如果我只想记录问题,而不抛出异常,该怎么办?你总是可以捕获异常并记录,而不是……当然……我没想过。谢谢你,第三方库可以接受吗?这听起来像番石榴的完美工作。是的!这完全有效!作为一个附带问题,如果我只想记录问题,而不抛出异常怎么办?你总是可以捕获异常并记录,而不是…当然…我没有思考。谢谢