Java8中常用的函数式接口
函数接口 | 函数描述符 | 原始类型特化 |
---|---|---|
Predicate | T->boolean | Int… |
Consumer | T->void | Int… |
Function | T->R | Int..IntTo..ToInt.. |
Supplier | ()->T | Boolean..Int.. |
UnaryOperator | T->T | Int |
BinaryOperator | (T,T)->T | Int |
BiPredicate | (L,R)->boolean | |
BiConsumer | (T,U)->void | ObjInt.. |
BiFunction | (T,U)->R | ToInt.. |
上表中最后一列中的Int可以替换为Long和Doublera然后再加上函数接口名, 原始类型特化基本上都是Int, Long, Double 开头, BooleanSupplier, BiPredicate没有特化类型
如果没有需要的接口,可以自行定义
比如我需要(T,U,R)->void,先定义一个函数式接口
/**
* Created by LYJ on 2016/10/7.
*/
@FunctionalInterface
public interface MyFunction<T,U,R>{
void excute(T t,U u,R r);
}
/**
* Created by LYJ on 2016/10/7.
*/
public class Main {
public static void main(String[] args) {
//为了简化,我们值判断 Integer转成字符串和String值是否相等,没有用到Double
//可以看到下面这行代码用了行为参数化
//第4个参数,将代码当作参数传递给函数式接口去执行,更灵活更简洁
int result= goExcute(1,"1",0.1,(Integer a,String b,Double c)->(a+"").equals(b));
System.out.println(result + " --------- result --- Main.main\n");
}
/**
* @param t 在这个例子中 代表Integer,因为int是基础类型所以不行
* @param u 代表String
* @param r 代表Double
* @param f 我们自定义的函数式接口,传递代码
* @param <T>
* @param <U>
* @param <R>
* @return
*/
public static <T,U,R> int goExcute(T t,U u,R r,MyFunction<T,U,R> f){
if(f.excute(t,u,r)){
return 1;
}
else
return 0;
}
}