Java 8 Условный фильтр | Лямбда - PullRequest
1 голос
/ 04 февраля 2020
    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;

Ответы [ 4 ]

2 голосов
/ 05 февраля 2020

Кредиты в @ J oop 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());
1 голос
/ 05 февраля 2020

Первый фильтр должен проверяться на наличие пустого объекта. В вашем коде есть два случая для этой проверки. Вы можете сделать это, найдя первый нулевой объект и сделав отрицание, чтобы остановить следующую фильтрацию.

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

    ...
0 голосов
/ 05 февраля 2020

Самое элегантное решение в этом случае - создать свой собственный 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());
0 голосов
/ 05 февраля 2020

Вы можете добавить несколько условий как часть фильтра .filter (user -> (null == user.getEyeColor () || user.getEyeColor (). EqualsIgnoreCase (eyeColor)))

...