BiPredicate示例
在Java8中,BiPredicate是1一个函数接口,它接收两个参数,返回一个boolean类型的结果。BiPredicate和Predicate是一样的,只不过它的test()接收两个参数
@FunctionalInterface
public interface BiPredicate<T, U> {
boolean test(T t, U u);
}
BiPredicate
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
BiPredicate作为函数参数
下面示例展示了,通过域名和威胁评分来过滤域名
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}]