Java Stream如何先映射再过滤且保留原对象?求简洁实现方案
Java Stream 映射后保留原对象的过滤方案需求与疑问
现有Stream过滤方式
当操作对象类型的Stream时,简单过滤逻辑可通过方法引用优雅实现:
swimmingAnimalStream = animalStream .filter(Animal::canSwim);
若过滤逻辑稍复杂,则需改用Lambda表达式替代方法引用:
greenAnimals = animalStream .filter(animal -> animal.getColor().equals(Colors.GREEN));
需求场景:映射属性后过滤,保留原对象
现在需要实现一种逻辑:先对对象的某个属性做映射,再基于映射结果过滤,但过滤后要保留完整的原对象。以下写法不符合需求——它仅保留属性信息,丢失了原对象:
animalStream .map(Animal::getColor) .filter(Colors.GREEN::equals)
期望的简洁实现方式
希望避免单独提取方法,用更简洁的写法实现,例如类似如下形式:
animalStream .filter(Colors.GREEN::equals, Animal::getColor);
对应的自定义filter方法签名如下:
<MAPPED> Stream<T> filter(Predicate<MAPPED> filter, Function<? super T, MAPPED> mappingFunction);
更理想的情况是支持组合多个映射函数,不过暂时可不用纠结泛型的实现细节。此外,方案需支持任意Predicate,比如判断对象属性是否存在的场景:
animalWithMotherStream = animalStream .filter(Optional::isPresent, Animal::getMother);
疑问
是否存在更简洁的解决方案,或者已经实现该功能的工具库?
内容的提问来源于stack exchange,提问作者Dario Viva
相关产品推荐
相关产品推荐

