在流中使用谓词 Java 8

Use predicate in stream Java 8

我不明白,如何为 stream 构建谓词。
有class:

public class User {
    @Getter
    @Setter
    private String firstName;

    @Getter
    @Setter
    private String secondName;
}

此外,我有 class 谓词:

public final class Predicates {

    private Predicates() {
    }

    /**
     * Returns a predicate, Not
     */
    public static <T> Predicate<T> not(Predicate<T> predicate) {
        return predicate.negate();
    }

    /**
     * Returns a predicate, isNull
     */
    public static <T> Predicate<T> isNull(Object o) {
        return (o == null)
                ? ObjectPredicate.IS_NULL.callback()
                : ObjectPredicate.ALWAYS_FALSE.callback();
    }

    //Enum for predicate object
    enum ObjectPredicate implements Predicate<Object> {
        IS_NULL {
            @Override
            public boolean test(Object o) {
                return o == null;
            }
        },
        ALWAYS_FALSE {
            @Override
            public boolean test(Object o) {
                return false;
            }
        };

        <T> Predicate<T> callback() {
            return (Predicate<T>) this;
        }
    }
}

然后我想使用这样的东西:

List<User> users = getSomeUserList();
Booleant check = users.stream().anyMatch(Predicate.isNull(User::getSecondName));

帮助我理解,我做错了什么。

您可以使用 mapStream<User> 映射到 Stream<String>,然后使用谓词搜索匹配项:

Boolean check = users.stream()
                     .map(User::getSecondName)
                     .anyMatch(Predicates::isNull);

尝试以下操作:

public static <T, R> Predicate<T> isNull(Function<T, R> mapper) {
        return new Predicate<T> {
            @Override
            boolean test(T o) {
               return ObjectPredicate.IS_NULL.callback().test(mapper.apply(o));
            }
        }
}