【问题标题】:Java 8 Conditional Filter | LambdasJava 8 条件过滤器 |拉姆达斯
【发布时间】:2020-05-20 18:05:02
【问题描述】:
    return userRepo
            .findAll()
            .stream()
            .filter(user -> user.getIsActive()==active)
            .filter(user -> user.getEyeColor().equalsIgnoreCase(eyeColor))
            .filter(user -> user.getBalance() >= balance.doubleValue())
            .filter(user -> user.getAge() >= age.intValue())
            .filter(user -> user.getAddress().getZip() == zipCode.intValue())
            .collect(Collectors.toList());

如何在例如 eyeColor= null 时跳过过滤器行;

【问题讨论】:

  • user -> eyeColor == null || ...
  • @VLAZ- 实际上这不起作用会导致异常。
  • @JoopEggen .. 尝试过 .. 不工作 .. 如果可能,我想跳过整个评估
  • 没问题,很高兴看到 Stream。
  • .filter(x -> true) 继续接受每个 x,.filter(x -> false) 拒绝每个 x

标签: java lambda filter java-stream


【解决方案1】:

第一个过滤器应该检查一个空对象。在您的代码中,此检查有两种情况。您可以通过查找第一个空对象并进行否定来停止下一次过滤来做到这一点。

return userRepo
    .findAll()
    .stream()
    .filter(user -> ! Stream.of(user.getEyeColor(), user.getAddress()).anyMatch(Objects::isNull) )
    .filter(user -> user.getIsActive()==active)

    ...

【讨论】:

    【解决方案2】:

    在这种情况下,最优雅的解决方案是创建自己的Predicate<User>,如下所示

    public class UserPredicate implements Predicate<User> {
    
        boolean active; String eyeColor; double balance; int age; int zipCode;
    
        public UserPredicate(boolean active, String eyeColor, double balance, int age, int zipCode) {
             // assign to variables
        }
    
        @Override
        public boolean test(User user) {
            return isActive(user) && hasExpectedBalance(user) && hasExpectedAge(user) && hasExpectedZipCode(user);
        }
    
        // implement the methods user in test
        private isActive(User user) {
            return user != null && user.getActive() == this.active;
        }
    
        // etc...
    }
    

    然后在你的代码中,像这样使用它:

    return userRepo
            .findAll()
            .stream()
            .filter(new UserPredicate(active, eyeColor, balance.doubleValue(), age.intValue(), zipCode.intValue())
            .collect(Collectors.toList());
    

    【讨论】:

      【解决方案3】:

      您可以添加多个条件作为过滤器的一部分 .filter(user -> (null == user.getEyeColor() || user.getEyeColor().equalsIgnoreCase(eyeColor)))

      【讨论】:

        【解决方案4】:

        感谢@Joop Eggen

        return userRepo
            .findAll()
            .stream()
            .filter(user -> active == null || user.getIsActive() == active.booleanValue())
            .filter(user -> eyeColor == null || user.getEyeColor().equalsIgnoreCase(eyeColor))
            .filter(user -> user.getBalance() >= balance.doubleValue())
            .filter(user -> age == 0 || user.getAge() >= age)
            .filter(user -> zipCode == 0 || user.getAddress().getZip() == zipCode)
            .collect(Collectors.toList());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-28
          • 2014-07-26
          • 1970-01-01
          相关资源
          最近更新 更多