Java流:如何进行条件过滤?

ruoxqz4g  于 2023-03-11  发布在  Java
关注(0)|答案(3)|浏览(150)

我使用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时,如何跳过过滤?

a64a0gku

a64a0gku1#

如果你不想在每个x上检查空值,你可以把整个lambda放在一个三元表达式中:

return petRepository.findAll().stream()
            .filter(types.getIds().isEmpty() ? x -> true 
                    : x -> types.getIds().contains(x.getType().getId()))
            .collect(Collectors.groupingBy(x -> x.getType().getName(), Collectors.counting()));

或者将流弹出到临时变量中,并有条件地应用整个filter()

Stream<X> stream = petRepository.findAll().stream();
if (!types.getIds().isEmpty()) {
    stream = stream.filter(x -> types.getIds().contains(x.getType().getId()));
}
return stream.collect(Collectors.groupingBy(x -> x.getType().getName(), Collectors.counting()));
ccrfmcuu

ccrfmcuu2#

你只需要记住filter中的 predicate 必须返回true,无论你何时想要包含一个结果,所以在你的例子中,过滤条件必须是这样的,如果id不为空,filter只会为你想要的条件返回true,如果id为空,那么filter必须总是返回true。
您可以通过编写一个最小的测试示例(或者更好的是,使用junit或其他测试框架模拟petRepository)来实现这一点。
考虑:

Set<Integer> ids = Set.of(2);
List<Integer> elements = List.of(1, 2, 3);
List<Integer> list = elements.stream()
        .filter(u -> ids.size() > 0 ? ids.contains(u) : true)
        .toList();
System.out.println(list);

// output here will be [2]
// but if ids is empty it will be [1, 2, 3]

看看filter里面有什么:ids.size() > 0 ? ids.contains(u) : true
如果有id需要检查,看看elements的流元素是否包含在其中,如果没有id需要检查,则返回true(保留元素流中的所有内容以备管道中的下一步)。
这种情况下的三元表达式可以进一步简化为u -> ids.size() <= 0 || ids.contains(u)

zxlwwiss

zxlwwiss3#

不如

return petRepository.findAll().stream()
            .filter(x -> types.getIds().isEmpty() ||
                         types.getIds().contains(x.getType().getId()))
            .collect(Collectors.groupingBy(x -> x.getType().getName(), Collectors.counting()));

相关问题