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); //Predicate predicate=n->true //n是一个参数传递到Predicate接口的test方法 //n如果存在则test方法返回true System.out.println("输出所有数据:"); //传递参数n eval(list,n->true); //Predicate predicate1=n->n%2==0 //n是一个参数传递到Predicate接口的test方法 //如果n%2为0test方法返回true System.out.println("输出所有偶数:"); eval(list,n->n%2==0); //Predicate predicate2=n->n>3 //n是一个参数传递到Predicate接口的test方法 //如果n大于3test方法返回true System.out.println("输出大于3的所有数字:"); eval(list,n->n>3); } publicstaticvoideval(List list,Predicate predicate){ 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函数式接口及函数式接口实例,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!