java 仅当函数参数不为null时才使用流过滤器[已关闭]

oyjwcjzk  于 2022-12-10  发布在  Java
关注(0)|答案(3)|浏览(210)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

2小时前关门。
Improve this question
说我有:

public class Car{

private String model;
private Integer price;
   ...
}

public class CarsList {
    private List<Car> cars;

    public List<Car> filterFunction(Integer maxPrice, Integer minPrice) {
        return cars
                .stream()
                .filter(c -> c.getPrice() > minPrice)
                .filter(c -> c.getPrice() < maxPrice)
                .collect(Collectors.toList());
    }
}

但是,我有一种可能性,参数maxPrice或minPrice或两者都为空。
是否有方法仅在函数参数不为空时使用maxPrice和minPrice过滤器?
我知道我可以在过滤之前检查参数是否不为空,但是我必须为每个组合配置不同的过滤(如果我有5个参数会发生什么)。
我在想:stream.filter(minPrice != null || c -> c.getPrice() > minPrice),但我可以看到为什么这不起作用。

lh80um4z

lh80um4z1#

当minPrice为空时,您可以返回true以跳过此过滤器。
.filter(c -> minPrice==null || c.getPrice() > minPrice)

carvr3hs

carvr3hs2#

您只能根据参数有条件地使用筛选:

Stream<Car> stream = cars
        .stream();
if (Objects.nonNull(maxPrice))
    stream = stream.filter(c -> c.getPrice() < maxPrice);
if (Objects.nonNull(minPrice))
    stream = stream.filter(c -> c.getPrice() > minPrice);
return stream
        .collect(Collectors.toList());
41ik7eoe

41ik7eoe3#

我假设函数中的参数都是整数,我会将其改为

public List<Car> filterFunction(Integer... args)

然后检查是否有空值:

if (Arrays.stream(args).anyMatch(Objects::isNull))
    return;

之后,我知道函数中的所有参数都不是空的。
如果您希望参数按顺序排列,我将执行类似于上面的操作:

public List<Car> filterFunction(Integer maxPrice, Integer minPrice)

然后道:

if (Stream.of(minPrice, maxPrice).anyMatch(Objects::isNull))
    return;

基于上一条注解:

cars.stream()
    .filter(c -> {
            if (maxPrice == null)
                return c -> c.getPrice() > minPrice;
            if (minPrice == null)
                return c.getPrice() < maxPrice;

            return c.getPrice() > minPrice && c.getPrice() < maxPrice;
        })
    .collect(Collectors.toList());

相关问题