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

时间:2016-03-03 07:49:29

标签: 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());

java流中是否有任何可用的功能可以实现上述代码?

注意:上面的代码只是我正在做的事情的表示,而不是我正在寻找的确切代码。

2 个答案:

答案 0 :(得分:6)

您可以检查是否有任何元素通过了您的过滤器,如果没有,则使用Optional的{​​{1}}引发异常:

orElseThrow

当然,这只会在没有抛出异常时给你一个通过过滤器的元素,所以我不确定它是不是你想要的。

答案 1 :(得分:1)

如果要返回列表,如果其大小超过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());