一、基本方法
1.1、test(T t) 方法:
test方法主要用于参数符不符合规则。返回值 boolean
写法如下:
Predicate<String> fourLetterLong1 = new Predicate<String>() {
@Override
public boolean test(String s) {
return s.length()>4 ?true:false ;
}
};
配合Lambda filter 使用如下:
public static void main(String[] args) {
List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp","Hell","opt");
Predicate<String> fourLetterLong1 = new Predicate<String>() {
@Override
public boolean test(String s) {
return s.length()>4 ? true : false ;
}
};
names.stream()
.filter(fourLetterLong1)
.forEach((n) -> System.out.println("this is:" + n));
}
1.2 、and(Predicate<? super T> other)
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
add 方法等同于我们的逻辑与&&,存在短路特性,需要所有条件都满足
配合Lambda filter 使用如下:
public static void main(String[] args) {
List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");
Predicate<String> fourLetterLong1 = new Predicate<String>() {
@Override
public boolean test(String s) {
return s.length() > 4 ? true : false;
}
};
Predicate<String> startsWith = new Predicate<String>() {
@Override
public boolean test(String s) {
return s.equals("Haskell") ? true : false;
}
};
names.stream()
.filter(fourLetterLong1.and(startsWith))
.forEach((n) -> System.out.println("this is:" + n));
}
1.3 、or(Predicate<? super T> other)
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
or 等同于我们的逻辑或 || ,多个条件只要一个满足即可
配合Lambda filter 使用如下:
public static void main(String[] args) {
List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");
Predicate<String> fourLetterLong1 = new Predicate<String>() {
@Override
public boolean test(String s) {
return s.length() > 4 ? true : false;
}
};
Predicate<String> startsWith = new Predicate<String>() {
@Override
public boolean test(String s) {
return s.equals("zzz") ? true : false;
}
};
names.stream()
.filter(fourLetterLong1.or(startsWith))
.forEach((n) -> System.out.println("this is:" + n));
}
1.4、negate()方法
negate等同于我们的逻辑非 !
配合Lambda filter 使用如下:
public static void main(String[] args) {
List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");
Predicate<String> fourLetterLong1 = new Predicate<String>() {
@Override
public boolean test(String s) {
return s.length() > 4 ? true : false;
}
};
names.stream()
.filter(fourLetterLong1.negate())
.forEach((n) -> System.out.println("this is:" + n));
}
1.5、isEqual(Object targetRef)方法
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
isEqual 类似于equals()区别在于:先判断对象是否为NULL,不为Null的话再使用equals()方法进行比较
配合Lambda filter 使用如下:
public static void main(String[] args) {
List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");
Predicate<String> isEqual = new Predicate<String>() {
@Override
public boolean test(String s) {
return Predicate.isEqual("Java").test(s) ? true : false;
}
};
names.stream()
.filter(isEqual)
.forEach((n) -> System.out.println("this is:" + n));
}
二、扩展
使用Lambda 新特性和String类中的方法 多条查询
public static void main(String[] args) {
List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");
//长度为7
Predicate<String> length = (n) -> n.length() == 4;
// endsWith 方法字符串是否以指定的前缀开头。
Predicate<String> startsWith = (n) -> n.startsWith("J");
// endsWith 字符串是否以指定的后缀结尾。
Predicate<String> endsWith = (n) -> n.endsWith("a");
Predicate<String> isEqual = (n) ->Predicate.isEqual("Haskell").test(n);
names.stream()
.filter(length.and(startsWith).and(endsWith).or(isEqual))
.forEach((n) -> System.out.println("this is:" + n));
}