我使用Java Stream编写了以下stream语句,并根据typeId值types.getIds().contains(x.getType().getId())
过滤记录:
return petRepository.findAll().stream()
.filter(x -> types.getIds().contains(x.getType().getId()))
.collect(Collectors.groupingBy(x -> x.getType().getName(), Collectors.counting()));
然而,我想获取所有的值时types.getIds().size() == 0
和尝试的东西如下shpon:
.filter(types.getIds().size() > 0 ? x -> types.getIds().contains(x.getType().getId()) : <NO FILTERING>)
那么,当types.getIds().size() == 0
时,如何跳过过滤?
3条答案
按热度按时间a64a0gku1#
如果你不想在每个
x
上检查空值,你可以把整个lambda放在一个三元表达式中:或者将流弹出到临时变量中,并有条件地应用整个
filter()
:ccrfmcuu2#
你只需要记住
filter
中的 predicate 必须返回true,无论你何时想要包含一个结果,所以在你的例子中,过滤条件必须是这样的,如果id不为空,filter只会为你想要的条件返回true,如果id为空,那么filter必须总是返回true。您可以通过编写一个最小的测试示例(或者更好的是,使用junit或其他测试框架模拟petRepository)来实现这一点。
考虑:
看看
filter
里面有什么:ids.size() > 0 ? ids.contains(u) : true
如果有id需要检查,看看
elements
的流元素是否包含在其中,如果没有id需要检查,则返回true(保留元素流中的所有内容以备管道中的下一步)。这种情况下的三元表达式可以进一步简化为
u -> ids.size() <= 0 || ids.contains(u)
。zxlwwiss3#
不如