Java Stream:如何有条件过滤?

6 java lambda functional-programming java-stream

我有以下 Java 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()));
Run Code Online (Sandbox Code Playgroud)

但是,我想在types.getIds().size() == 0尝试以下 shpon 时获取所有值:

.filter(types.getIds().size() > 0 ? x -> types.getIds().contains(x.getType().getId()) : <NO FILTERING>)
Run Code Online (Sandbox Code Playgroud)

那么,我怎样才能跳过过滤呢types.getIds().size() == 0

shm*_*sel 5

如果您不想检查每个 是否为空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()));
Run Code Online (Sandbox Code Playgroud)

或者将流弹出到临时变量中并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()));
Run Code Online (Sandbox Code Playgroud)


Tho*_*ger 1

怎么样

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