考虑以下虚拟代码:
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流中是否有任何可用的功能可以实现上述代码?
注意:上面的代码只是我正在做的事情的表示,而不是我正在寻找的确切代码。
答案 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());