Java8 BiPredicate的使用(Predicate使用2个参数)
在Java 8中, BiPredicate是一个函数接口,它接受两个参数并返回一个布尔值,基本上,此BiPredicate
与Predicate
相同,相反,它需要2个参数进行测试。
-
-
public interface BiPredicate<T, U> {
-
boolean test(T t, U u);
-
}
进一步阅读
Java 8谓词示例
1. BiPredicate Hello World。
如果字符串长度匹配提供的长度?
JavaBiPredicate1.java
-
package com.mkyong.java8;
-
-
import java.util.function.BiPredicate;
-
-
public class JavaBiPredicate1 {
-
-
public static void main(String[] args) {
-
-
BiPredicate<String, Integer> filter = (x, y) -> {
-
return x.length() == y;
-
};
-
-
boolean result = filter.test("mkyong", 6);
-
System.out.println(result); // true
-
-
boolean result2 = filter.test("java", 10);
-
System.out.println(result2); // false
-
}
-
-
}
输出量
-
true
-
false
2. BiPredicate作为函数参数。
本示例使用BiPredicate
通过域名或威胁分数过滤不良域名。
JavaBiPredicate2.java
-
package com.mkyong.java8;
-
-
import java.util.Arrays;
-
import java.util.List;
-
import java.util.function.BiPredicate;
-
import java.util.stream.Collectors;
-
-
public class JavaBiPredicate2 {
-
-
public static void main(String[] args) {
-
-
List<Domain> domains = Arrays.asList(new Domain("google.com", 1),
-
new Domain("i-am-spammer.com", 10),
-
new Domain("mkyong.com", 0),
-
new Domain("microsoft.com", 2));
-
-
BiPredicate<String, Integer> bi = (domain, score) -> {
-
return (domain.equalsIgnoreCase("google.com") || score == 0);
-
};
-
-
// if google or score == 0
-
List<Domain> result = filterBadDomain(domains, bi);
-
System.out.println(result); // google.com, mkyong.com
-
-
// if score == 0
-
List<Domain> result2 = filterBadDomain(domains, (domain, score) -> score == 0);
-
System.out.println(result2); // mkyong.com, microsoft.com
-
-
// if start with i or score > 5
-
List<Domain> result3 = filterBadDomain(domains, (domain, score) -> domain.startsWith("i") && score > 5);
-
System.out.println(result3); // i-am-spammer.com
-
-
// chaining with or
-
List<Domain> result4 = filterBadDomain(domains, bi.or(
-
(domain, x) -> domain.equalsIgnoreCase("microsoft.com"))
-
);
-
System.out.println(result4); // google.com, mkyong.com, microsoft.com
-
-
-
}
-
-
public static <T extends Domain> List<T> filterBadDomain(
-
List<T> list, BiPredicate<String, Integer> biPredicate) {
-
-
return list.stream()
-
.filter(x -> biPredicate.test(x.getName(), x.getScore()))
-
.collect(Collectors.toList());
-
-
}
-
}
-
-
class Domain {
-
-
String name;
-
Integer score;
-
-
public Domain(String name, Integer score) {
-
this.name = name;
-
this.score = score;
-
}
-
// getters , setters , toString
-
}
输出量
-
[Domain{name='google.com', score=1}, Domain{name='mkyong.com', score=0}]
-
[Domain{name='mkyong.com', score=0}]
-
[Domain{name='i-am-spammer.com', score=10}]
-
[Domain{name='google.com', score=1}, Domain{name='mkyong.com', score=0}, Domain{name='microsoft.com', score=2}]