浅谈Java 8 新增函数式接口到底是什么
从Java8开始便出现了函数式接口(FunctionalInterface,以下简称FI)
定义为:如果一个接口只有唯一的一个抽象接口,则称之为函数式接口。为了保证接口符合FI,通常会在接口类上添加@FunctionalInterface注解。理解了函数式接口可以为Java函数式编程打下基础,最终可通过运用函数式编程极大地提高编程效率。
函数式接口(FunctionalInterface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以对现有的函数友好地支持lambda。
JDK1.8之前已有的函数式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
JDK1.8新增加的函数接口:
- java.util.function
网上很多教程说新增4个函数接口是不对的,java.util.function它包含了很多类,用来支持Java的函数式编程,该包中的函数式接口43个,但是最主要的是这四个:
(1)功能性接口:Function
(2)断言性接口:Predicate
(3)供给性接口:Supplier
(4)消费性接口:Consumer
详细一点介绍:
函数式接口 | 参数类型 | 返回类型 | 用途 |
---|---|---|---|
Consumer | T | void | 对类型T参数操作,无返回结果,包含方法voidaccept(Tt) |
Supplier | 无 | T | 返回T类型参数,方法时Tget() |
Function | T | R | 对类型T参数操作,返回R类型参数,包含方法Rapply(Tt) |
Predicate | T | boolean | 断言型接口,对类型T进行条件筛选操作,返回boolean,包含方法booleantest(Tt) |
具体的使用:
/** *Java8内置的四大核心函数式接口: *Consumer:消费型接口 *Supplier供给型接口 *Function函数型接口 *Predicate段言型接口 *booleantest(Tt) */ publicclassTestLamda3{ //Consumer@Test publicvoidtest1(){ happy(10000,(m)->System.out.println("这次消费了"+m+"元")); } publicvoidhappy(doublemoney,Consumer con){ con.accept(money); } //Supplier @Test publicvoidtest2(){ List list=getNumList(5,()->{ return(int)Math.random()*100; }); list.forEach(System.out::println); } publicList getNumList(intnum,Supplier supplier){ List list=newArrayList<>(); for(inti=0;i str.trim()); System.out.println(newStr); } publicStringstrHandle(Stringstr,Function fun){ returnfun.apply(str); } //段言型接口;将满足条件的字符串放入集合中 @Test publicvoidtest5(){ List list1=Arrays.asList("nihao","hiehei","woai","ni"); List list=filterStr(list1,(s)->s.length()>3); for(Strings:list){ System.out.println(s); } } publicList filterStr(List list,Predicate pre){ List strings=newArrayList<>(); for(Stringstring:list){ if(pre.test(string)){ strings.add(string); } } returnstrings; } }
全部接口:
代表了一个接受两个输入参数的操作,并且不返回任何结果 代表了一个接受两个输入参数的方法,并且返回一个结果 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 代表了一个两个参数的boolean值方法 代表了boolean值结果的提供方 代表了接受一个输入参数并且无返回的操作 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。 代表一个接受double值参数的操作,并且不返回结果。 代表接受一个double值参数的方法,并且返回结果 代表一个拥有double值参数的boolean值方法 代表一个double值结构的提供方 接受一个double类型输入,返回一个int类型结果。 接受一个double类型输入,返回一个long类型结果 接受一个参数同为类型double,返回值类型也为double。 接受一个输入参数,返回一个结果。 接受两个参数同为类型int,返回值类型也为int。 接受一个int类型的输入参数,无返回值。 接受一个int类型输入参数,返回一个结果。 接受一个int输入参数,返回一个布尔值的结果。 无参数,返回一个int类型结果。 接受一个int类型输入,返回一个double类型结果。 接受一个int类型输入,返回一个long类型结果。 接受一个参数同为类型int,返回值类型也为int。 接受两个参数同为类型long,返回值类型也为long。 接受一个long类型的输入参数,无返回值。 接受一个long类型输入参数,返回一个结果。 R接受一个long输入参数,返回一个布尔值类型结果。 无参数,返回一个结果long类型的值。 接受一个long类型输入,返回一个double类型结果。 接受一个long类型输入,返回一个int类型结果。 接受一个参数同为类型long,返回值类型也为long。 接受一个object类型和一个double类型的输入参数,无返回值。 接受一个object类型和一个int类型的输入参数,无返回值。 接受一个object类型和一个long类型的输入参数,无返回值。 接受一个输入参数,返回一个布尔值结果。 无参数,返回一个结果。 接受两个输入参数,返回一个double类型结果 接受一个输入参数,返回一个double类型结果 接受两个输入参数,返回一个int类型结果。 接受一个输入参数,返回一个int类型结果。 接受两个输入参数,返回一个long类型结果。 接受一个输入参数,返回一个long类型结果。 接受一个参数为类型T,返回值类型也为T。
序号
接口&描述
1
BiConsumer
2
BiFunction
3
BinaryOperator
4
BiPredicate
5
BooleanSupplier
6
Consumer
7
DoubleBinaryOperator
8
DoubleConsumer
9
DoubleFunction
10
DoublePredicate
11
DoubleSupplier
12
DoubleToIntFunction
13
DoubleToLongFunction
14
DoubleUnaryOperator
15
Function
16
IntBinaryOperator
17
IntConsumer
18
IntFunction
19
IntPredicate
20
IntSupplier
21
IntToDoubleFunction
22
IntToLongFunction
23
IntUnaryOperator
24
LongBinaryOperator
25
LongConsumer
26
LongFunction
27
LongPredicate
28
LongSupplier
29
LongToDoubleFunction
30
LongToIntFunction
31
LongUnaryOperator
32
ObjDoubleConsumer
33
ObjIntConsumer
34
ObjLongConsumer
35
Predicate
36
Supplier
37
ToDoubleBiFunction
38
ToDoubleFunction
39
ToIntBiFunction
40
ToIntFunction
41
ToLongBiFunction
42
ToLongFunction
43
UnaryOperator
总结
函数式接口(FunctionalInterface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口是为了lambda表达式服务,函数式接口的存在是lambda表达式出现的前提,lambda表达式想关于重写了函数式接口中的唯一方法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。