Java 8 Function函数式接口及函数式接口实例
函数式接口(FunctionalInterface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为lambda表达式。
函数式接口可以现有的函数友好地支持lambda。
介绍
函数式接口其实就是一个抽象接口类,在Java8之前已有的函数式接口有以下。
java.lang.Runnable java.util.concurrent.Callable java.util.Comparator
等等...
使用方法
其实上述所说的接口类只需要使用FunctionalInterface注解修饰,就成为了Java中的函数式接口。比如JDK中Callable接口定义
@FunctionalInterface publicinterfaceCallable{ Vcall()throwsException; }
就这么简单。
现在来讲讲Java8新增Function接口。下面是其定义
//T是传入参数 //R是返回参数 @FunctionalInterface publicinterfaceFunction{ Rapply(Tt); default Function compose(Functionbefore{ Objects.requireNonNull(before); return(Vv)->apply(before.apply(v)); } default Function andThen(Functionafter){ Objects.requireNonNull(after); return(Tt)->after.apply(apply(t)); } static Function identity(){ returnt->t; } }
他可以理解为C语言中的函数指针(个人看法)。
在实际使用中,apply方法使用比较广泛。compose/andThen多用于两个以上函数接口并且执行上有先后顺序的场景下。
在具体业务代码中,我一般结合BiFuncton/Supplier一起使用。BiFunction支持2个参数的,Function只支持一个参数。Supplier可以用来存储具体需要的值,通过get来获取。
例子
引用平时工作的代码。该例子主要规避了多个判断条件if/else造成代码臃肿的,同时也可以把相同的业务逻辑抽象出函数接口,从而可以在多处代码重用。具体代码如下。
Function
总结
个人认为,在业务逻辑分支判断较多的场景,是比较适合使用Function的,而且还有以下几点好处
- 代码看上去比较简洁
- 相同逻辑可以重用(当然封装成函数也是可以的~)
- 代码后期比较好维护点。
函数式接口实例
Predicate
该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。
该接口用于测试对象是true或false。
我们可以通过以下实例(Java8Tester.java)来了解函数式接口Predicate
Java8Tester.java文件
importjava.util.Arrays;
importjava.util.List;
importjava.util.function.Predicate;
publicclassJava8Tester{
publicstaticvoidmain(Stringargs[]){
Listlist=Arrays.asList(1,2,3,4,5,6,7,8,9);
//Predicatepredicate=n->true
//n是一个参数传递到Predicate接口的test方法
//n如果存在则test方法返回true
System.out.println("输出所有数据:");
//传递参数n
eval(list,n->true);
//Predicatepredicate1=n->n%2==0
//n是一个参数传递到Predicate接口的test方法
//如果n%2为0test方法返回true
System.out.println("输出所有偶数:");
eval(list,n->n%2==0);
//Predicatepredicate2=n->n>3
//n是一个参数传递到Predicate接口的test方法
//如果n大于3test方法返回true
System.out.println("输出大于3的所有数字:");
eval(list,n->n>3);
}
publicstaticvoideval(Listlist,Predicatepredicate){
for(Integern:list){
if(predicate.test(n)){
System.out.println(n+"");
}
}
}
}
执行以上脚本,输出结果为:
$javacJava8Tester.java
$javaJava8Tester
输出所有数据:
1
2
3
4
5
6
7
8
9
输出所有偶数:
2
4
6
8
输出大于3的所有数字:
4
5
6
7
8
9
总结
以上所述是小编给大家介绍的Java8Function函数式接口及函数式接口实例,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!