Java流:根据流中的值抛出异常

5

Consider below dummy code:

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

在Java流中是否有可用的功能,可以实现类似上述代码的功能?
注意:上述代码只是我所做的事情的代表,不是我正在寻找的确切代码。
2个回答

6

您可以检查是否有任何元素通过了您的筛选,并使用OptionalorElseThrow方法,如果没有,则会抛出异常:

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

当然,这只会给你在异常未被抛出时通过筛选器的其中一个元素,所以我不确定它是否完全符合你的要求。


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

2
如果您想在列表大小超过n个元素时返回该列表,可以使用collectingAndThen收集器:
List<Integer> list = 
    intList.stream()
           .filter(i -> i > 40)
           .collect(collectingAndThen(toList(), l -> { if (l.isEmpty()) throw new WhatEverRuntimeException(); return l;}));

然而,结果可能不够易读,因此您可以在收集结果后添加if语句:

List<Integer> list = intList.stream().filter(i -> i > 40).collect(toList());
if (list.isEmpty()) {
    throw new 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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接