Java8新特性04 内置功能接口
内置功能接口借鉴了Google Guava库的实践。Java8的内置功能接口在java.util.function包下,主要有四大核心的功能性接口:谓词(predicate)、函数(function)、生产者(supplier)、消费者(consumer)
一. 谓词(Predicate)
这里是谓词的源码:
1 /* 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 */ 25 package java.util.function; 26 27 import java.util.Objects; 28 29 /** 30 * Represents a predicate (boolean-valued function) of one argument. 31 * 32 * <p>This is a <a href="package-summary.html">functional interface</a> 33 * whose functional method is {@link #test(Object)}. 34 * 35 * @param <T> the type of the input to the predicate 36 * 37 * @since 1.8 38 */ 39 @FunctionalInterface 40 public interface Predicate<T> { 41 42 /** 43 * Evaluates this predicate on the given argument. 44 * 45 * @param t the input argument 46 * @return {@code true} if the input argument matches the predicate, 47 * otherwise {@code false} 48 */ 49 boolean test(T t); 50 51 /** 52 * Returns a composed predicate that represents a short-circuiting logical 53 * AND of this predicate and another. When evaluating the composed 54 * predicate, if this predicate is {@code false}, then the {@code other} 55 * predicate is not evaluated. 56 * 57 * <p>Any exceptions thrown during evaluation of either predicate are relayed 58 * to the caller; if evaluation of this predicate throws an exception, the 59 * {@code other} predicate will not be evaluated. 60 * 61 * @param other a predicate that will be logically-ANDed with this 62 * predicate 63 * @return a composed predicate that represents the short-circuiting logical 64 * AND of this predicate and the {@code other} predicate 65 * @throws NullPointerException if other is null 66 */ 67 default Predicate<T> and(Predicate<? super T> other) { 68 Objects.requireNonNull(other); 69 return (t) -> test(t) && other.test(t); 70 } 71 72 /** 73 * Returns a predicate that represents the logical negation of this 74 * predicate. 75 * 76 * @return a predicate that represents the logical negation of this 77 * predicate 78 */ 79 default Predicate<T> negate() { 80 return (t) -> !test(t); 81 } 82 83 /** 84 * Returns a composed predicate that represents a short-circuiting logical 85 * OR of this predicate and another. When evaluating the composed 86 * predicate, if this predicate is {@code true}, then the {@code other} 87 * predicate is not evaluated. 88 * 89 * <p>Any exceptions thrown during evaluation of either predicate are relayed 90 * to the caller; if evaluation of this predicate throws an exception, the 91 * {@code other} predicate will not be evaluated. 92 * 93 * @param other a predicate that will be logically-ORed with this 94 * predicate 95 * @return a composed predicate that represents the short-circuiting logical 96 * OR of this predicate and the {@code other} predicate 97 * @throws NullPointerException if other is null 98 */ 99 default Predicate<T> or(Predicate<? super T> other) { 100 Objects.requireNonNull(other); 101 return (t) -> test(t) || other.test(t); 102 } 103 104 /** 105 * Returns a predicate that tests if two arguments are equal according 106 * to {@link Objects#equals(Object, Object)}. 107 * 108 * @param <T> the type of arguments to the predicate 109 * @param targetRef the object reference with which to compare for equality, 110 * which may be {@code null} 111 * @return a predicate that tests if two arguments are equal according 112 * to {@link Objects#equals(Object, Object)} 113 */ 114 static <T> Predicate<T> isEqual(Object targetRef) { 115 return (null == targetRef) 116 ? Objects::isNull 117 : object -> targetRef.equals(object); 118 } 119 }
说明:谓词是单参数的返回布尔值的函数式接口,输入一个函数,返回true或者false。同时该接口也包含多个默认方法或静态方法使用谓词转换成复杂的逻辑表达式(与、或、非等)
举例:
1 package com.test.a; 2 3 import java.util.function.Predicate; 4 5 public class Test { 6 public static void main(String args[]) { 7 8 String str="hello"; 9 10 //1.测试抽象方法 11 Predicate<String> predicate1=(String s)->s.length()>6; 12 boolean result1=predicate1.test(str); 13 System.out.println(result1);//false 14 15 //2.使用 default Predicate<T> and(Predicate<? super T> other) 16 Predicate<String> predicate2=(String s)->s.length()==5; 17 boolean result2=predicate1.and(predicate2).test(str); 18 System.out.println(result2);//false 19 20 //3.使用 default Predicate<T> or(Predicate<? super T> other) 21 boolean result3=predicate1.or(predicate2).test(str); 22 System.out.println(result3);//true 23 24 //4.使用default Predicate<T> negate() 25 boolean result4=predicate1.negate().test(str); 26 System.out.println(result4);//true 27 28 //5.使用static <T> Predicate<T> isEqual(Object targetRef) 29 Predicate<String> predicate5=Predicate.isEqual("hello2"); 30 boolean result5=predicate5.test(str); 31 System.out.println(result5);//false 32 33 } 34 }