【前序】:
在Java8中,内置了四个核心函数接口,它们存在是Lamda表达式出现的前提,Lamda表达式想重写函数式接口中的唯一方法。
函数式接口与Lambda表达式之间的关系:lambda表达式相当于是一个行为,传入函数式接口中,进来实现各种操作,即行为参数化
它们的接口内只有一个抽象方法,每一个函数式接口都有@FunctionalInterface注解。
四种函数式接口分别为:
Consumer< T>:消费型接口
接口方法 void accept(T t):参数类型是T,无返回值
Supplier< T>供给型接口
接口方法 T get():参数类型是T,返回T类型参数
Function<T,R>函数型接口</T,R>
接口方法R apply(T):对类型T参数操作,返回R类型参数
Predicate< T>段言型接口
接口方法 boolean test(T t):对类型T进行条件筛选操作,返回boolean
目录
Consumer接口
描述:Consumer< T>接口接受一个T类型参数,没有返回值。
源码如下:
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
}
测试代码如下:
@Test
public void test(){
UserT userT = new UserT("zm");
//接受一个参数
Consumer<UserT> userTConsumer = userT1 -> userT1.setName("zmChange");}; //lambda表达式的方法体就是Consumer接口的抽象方法具体实现(accept方法),其它接口也是一样
userTConsumer.accept(userT);
logger.info(userT.getName());//输出zmChange
}
Pridicate
描述:Predicate< T>接口接受一个T类型参数,返回一个boolean值。
源码:
public interface Predicate<T> {
boolean test(T t);
}
测试代码如下:
Predicate<Integer> boolValue = x -> x>5;//1.
log.info(boolValue.test(1) + "");//2.
log.info(boolValue.test(6) + "");//3.
1表示定义了一个Predicate实现,入参为Integer,返回传入参数与5的比较。
2,3表示调用1的实现,传入相关参数,下面看结果:
十二月 14, 2016 11:41:43 下午 com.zm.demo.PredicateTest testPre
信息: false
十二月 14, 2016 11:41:43 下午 com.zm.demo.PredicateTest testPre
信息: true
第一个输出为false, 第二个输出为true,结果与 。预期一样。
当然了,这里入参也可以是其他的,比如字符串,对字符串进行比较啥的,这些看官们可以自己去实现了。
Funcation
描述:Function< T,R> 接口接受一个T类型参数,返回R类型对象或值
源码如下:
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
测试代码:传入一个Integer类型的参数,输出一个String类型的值
@Test
public void test(){
Function<Integer,String>function = x->"result: " + x.toString();
logger.info(function.apply(15));//输出 result: 15
}
Supplier
描述:Supplier< T>
接口没有入参,返回一个T类型的对象,类似工厂方法。
源码:
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
测试代码:
@Test
public void test(){
Supplier<User> supplier = ()->new User();
User user = supplier.get();
logger.info(user.toString());
logger.info(supplier.get().toString());
}
测试结果:
十二月 25, 2016 9:55:46 上午 com.zm.demo.SuppierTest test
信息: com.zm.entity.User@1963006a
十二月 25, 2016 9:55:46 上午 com.zm.demo.SuppierTest test
信息: com.zm.entity.User@6d9c638
可以看出调用一次返回一个对象