在流中使用谓词 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));
帮助我理解,我做错了什么。
您可以使用 map
将 Stream<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));
}
}
}
我不明白,如何为 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));
帮助我理解,我做错了什么。
您可以使用 map
将 Stream<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));
}
}
}