Java流:根据流中的值从流中引发异常

Java流:根据流中的值从流中引发异常,java,exception,java-stream,Java,Exception,Java Stream,考虑以下伪代码: List<Integer> intList = new ArrayList<>(); intList.add(10); intList.add(20); intList.add(30); intList.stream().filter(i -> i > 40) .throwIf(size of list <= 0) .collect(Collectors.toList()); List intList=new Arr

考虑以下伪代码:

List<Integer> intList = new ArrayList<>();
intList.add(10);
intList.add(20);
intList.add(30);

intList.stream().filter(i -> i > 40)
    .throwIf(size of list <= 0)
    .collect(Collectors.toList());
List intList=new ArrayList();
增加(10);
增加(20);
增加(30);
intList.stream().filter(i->i>40)

.throwIf(列表的大小您可以检查是否有任何元素通过了筛选,如果没有,则使用
可选的
或lsetrow来抛出异常:

Integer match = 
    intList.stream()
           .filter(i -> i > 40)
           .findAny()
           .orElseThrow(...);

当然,这只会在未引发异常时为您提供一个通过过滤器的元素,因此我不确定它是否正是您想要的。

如果要在列表大小超过n个元素时返回列表,您可以使用
CollectingAnd然后
收集器:

List<Integer> list = 
    intList.stream()
           .filter(i -> i > 40)
           .collect(collectingAndThen(toList(), l -> { if (l.isEmpty()) throw new WhatEverRuntimeException(); return l;}));
列表=
intList.stream()
.过滤器(i->i>40)
.collect(collectingAndThen(toList(),l->{if(l.isEmpty())抛出新WhatEverRuntimeException();返回l;}));
但是,它的可读性可能不如它得到的那么好,因此您可以在收集结果后简单地添加一条if语句:

List<Integer> list = intList.stream().filter(i -> i > 40).collect(toList());
if (list.isEmpty()) {
    throw new WhatEverRuntimeException();
}
List List=intList.stream().filter(i->i>40.collect(toList());
if(list.isEmpty()){
抛出新WhatEverRuntimeException();
}
最后,如果大小下限为100,您可能不想构建列表。在这种情况下,您可以使用两个流管道,一个用于计算满足设置的下限的元素数量,另一个用于实际构建列表:

long count = intList.stream().filter(i -> i > 40).count();
if(count < limit) {
    throw new WhatEverRuntimeException();
}
List<Integer> list = intList.stream().filter(i -> i > 40).collect(toList());
long count=intList.stream().filter(i->i>40.count();
如果(计数<限制){
抛出新WhatEverRuntimeException();
}
List List=intList.stream().filter(i->i>40.collect(toList());

这种方法有一个限制,即我们不能从中返回列表。@eatSleepCode在这种情况下,您需要收集列表并在之后进行检查。流只能产生一个结果。