浅谈Java 8 新增函数式接口到底是什么

网友投稿 385 2023-01-16


浅谈Java 8 新增函数式接口到底是什么

从 java 8 开始便出现了函数式接口(Functional Interface,以下简称FI)

定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口。为了保证接口符合 FI ,通常会在接口类上添加 @FunctionalInterface 注解。理解了函数式接口可以为 Java 函数式编程打下基础,最终可通过运用函数式编程极大地提高编程效率。

函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以对现有的函数友好地支持 lambda。

JDK 1.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

JDK 1.8 新增加的函数接口:

java.util.function

网上很多教程说新增 4 个函数接口是不对的,java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口 43 个,但是最主要的是这四个:

(1)功能性接口:Function

(2)断言性接口:Predicate

(3)供给性接口:Supplier

(4)消费性接口:Consumer

详细一点介绍:

函数式接口

参数类型

返回类型

用途

Consumer

T

void

对类型T参数操作,无返回结果,包含方法 void accept(T t)

Supplier

T

返回T类型参数,方法时 T get()

Function

T

R

对类型T参数操作,返回R类型参数,包含方法 R apply(T t)

Predicate

T

boolean

断言型接口,对类型T进行条件筛选操作,返回boolean,包含方法 boolean test(T t)

具体的使用:

/**

* Java8内置的四大核心函数式接口:

* Consumer:消费型接口

* Supplier供给型接口

* Function函数型接口

* Predicate段言型接口

* boolean test(T t)

*/

public class TestLamda3 {

//Consumer

@Test

public void test1(){

happy(10000,(m)-> System.out.println("这次消费了"+m+"元"));

}

public void happy(double money, Consumer con){

con.accept(money);

}

//Supplier

@Test

public void test2(){

List list= getNumList(5,()->{

return (int)Math.random()*100;

});

list.forEach(System.out::println);

}

public List getNumList(int num, Supplier supplier){

List list=new ArrayList<>();

for (int i=0; i

Integer n=supplier.get();

list.add(n);

}

return list;

}

//函数式接口

@Test

public void test4(){

String newStr=strHandle("\t\t\t woshi nide ",(str)->str.trim());

System.out.println(newStr);

}

public String strHandle(String str,Function fun){

return fun.apply(str);

}

//段言型接口;将满足条件的字符串放入集合中

@Test

public void test5(){

List list1= Arrays.asList("nihao","hiehei","woai","ni");

List list=filterStr(list1,(s)->s.length()>3);

for (String s : list) {

System.out.println(s);

}

}

public List filterStr(List list, Predicate pre){

List strings=new ArrayList<>();

for (String string : list) {

if(pre.test(string)){

strings.add(string);

}

}

return strings;

}

}

全部接口:

序号

接口 & 描述

1

BiConsumer

代表了一个接受两个输入参数的操作,并且不返回任何结果

2

BiFunction

代表了一个接受两个输入参数的方法,并且返回一个结果

3

BinaryOperator

代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果

4

BiPredicate

代表了一个两个参数的boolean值方法

5

BooleanSupplier

代表了boolean值结果的提供方

6

Consumer

代表了接受一个输入参数并且无返回的操作

7

DoubleBinaryOperator

代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。

8

DoubleConsumer

代表一个接受double值参数的操作,并且不返回结果。

9

DoubleFunction

代表接受一个double值参数的方法,并且返回结果

10

DoublePredicate

代表一个拥有double值参数的boolean值方法

11

DoubleSupplier

代表一个double值结构的提供方

12

DoubleToIntFunction

接受一个double类型输入,返回一个int类型结果。

13

DoubleToLongFunction

接受一个double类型输入,返回一个long类型结果

14

DoubleUnaryOperator

接受一个参数同为类型double,返回值类型也为double 。

15

Function

接受一个输入参数,返回一个结果。

16

IntBinaryOperator

接受两个参数同为类型int,返回值类型也为int 。

17

IntConsumer

接受一个int类型的输入参数,无返回值 。

18

IntFunction

接受一个int类型输入参数,返回一个结果 。

19

IntPredicate

接受一个int输入参数,返回一个布尔值的结果。

20

IntSupplier

无参数,返回一个int类型结果。

21

IntToDoubleFunction

接受一个int类型输入,返回一个double类型结果 。

22

IntToLongFunction

接受一个int类型输入,返回一个long类型结果。

23

IntUnaryOperator

接受一个参数同为类型int,返回值类型也为int 。

24

LongBiniELBMdElaryOperator

接受两个参数同为类型long,返回值类型也为long。

25

LongConsumer

接受一个long类型的输入参数,无返回值。

26

LongFunction

接受一个long类型输入参数,返回一个结果。

27

LongPredicate

R接受一个long输入参数,返回一个布尔值类型结果。

28

LongSupplier

无参数,返回一个结果long类型的值。

29

LongToDoubleFunction

接受一个long类型输入,返回一个double类型结果。

30

LongToIntFunction

接受一个long类型输入,返回一个int类型结果。

31

LongUnaryOperator

接受一个参数同为类型long,返回值类型也为long。

32

ObjDoubleConsumer

接受一个object类型和一个double类型的输入参数,无返回值。

33

ObjIntConsumer

接受一个object类型和一个int类型的输入参数,无返回值。

34

ObjLongConsumer

接受一个object类型和一个long类型的输入参数,无返回值。

35

Predicate

接受一个输入参数,返回一个布尔值结果。

36

Supplier

无参数,返回一个结果。

37

ToDoubleBiFunction

接受两个输入参数,返回一个double类型结果

38

ToDoubleFunction

接受一个输入参数,返回一个double类型结果

39

ToIntBiFunction

接受两个输入参数,返回一个int类型结果。

40

ToIntFunction

接受一个输入参数,返回一个int类型结果。

41

ToLongBiFunction

接受两个输入参数,返回一个long类型结果。

42

ToLongFunction

接受一个输入参数,返回一个long类型结果。

43

UnaryOperator

接受一个参数为类型T,返回值类型也为T。

总结

函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口是为了 lambda 表达式服务,函数式接口的存在是 lambda 表达式出现的前提,lambda 表达式想关于重写了函数式接口中的唯一方法。

Integer n=supplier.get();

list.add(n);

}

return list;

}

//函数式接口

@Test

public void test4(){

String newStr=strHandle("\t\t\t woshi nide ",(str)->str.trim());

System.out.println(newStr);

}

public String strHandle(String str,Function fun){

return fun.apply(str);

}

//段言型接口;将满足条件的字符串放入集合中

@Test

public void test5(){

List list1= Arrays.asList("nihao","hiehei","woai","ni");

List list=filterStr(list1,(s)->s.length()>3);

for (String s : list) {

System.out.println(s);

}

}

public List filterStr(List list, Predicate pre){

List strings=new ArrayList<>();

for (String string : list) {

if(pre.test(string)){

strings.add(string);

}

}

return strings;

}

}

全部接口:

序号

接口 & 描述

1

BiConsumer

代表了一个接受两个输入参数的操作,并且不返回任何结果

2

BiFunction

代表了一个接受两个输入参数的方法,并且返回一个结果

3

BinaryOperator

代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果

4

BiPredicate

代表了一个两个参数的boolean值方法

5

BooleanSupplier

代表了boolean值结果的提供方

6

Consumer

代表了接受一个输入参数并且无返回的操作

7

DoubleBinaryOperator

代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。

8

DoubleConsumer

代表一个接受double值参数的操作,并且不返回结果。

9

DoubleFunction

代表接受一个double值参数的方法,并且返回结果

10

DoublePredicate

代表一个拥有double值参数的boolean值方法

11

DoubleSupplier

代表一个double值结构的提供方

12

DoubleToIntFunction

接受一个double类型输入,返回一个int类型结果。

13

DoubleToLongFunction

接受一个double类型输入,返回一个long类型结果

14

DoubleUnaryOperator

接受一个参数同为类型double,返回值类型也为double 。

15

Function

接受一个输入参数,返回一个结果。

16

IntBinaryOperator

接受两个参数同为类型int,返回值类型也为int 。

17

IntConsumer

接受一个int类型的输入参数,无返回值 。

18

IntFunction

接受一个int类型输入参数,返回一个结果 。

19

IntPredicate

接受一个int输入参数,返回一个布尔值的结果。

20

IntSupplier

无参数,返回一个int类型结果。

21

IntToDoubleFunction

接受一个int类型输入,返回一个double类型结果 。

22

IntToLongFunction

接受一个int类型输入,返回一个long类型结果。

23

IntUnaryOperator

接受一个参数同为类型int,返回值类型也为int 。

24

LongBiniELBMdElaryOperator

接受两个参数同为类型long,返回值类型也为long。

25

LongConsumer

接受一个long类型的输入参数,无返回值。

26

LongFunction

接受一个long类型输入参数,返回一个结果。

27

LongPredicate

R接受一个long输入参数,返回一个布尔值类型结果。

28

LongSupplier

无参数,返回一个结果long类型的值。

29

LongToDoubleFunction

接受一个long类型输入,返回一个double类型结果。

30

LongToIntFunction

接受一个long类型输入,返回一个int类型结果。

31

LongUnaryOperator

接受一个参数同为类型long,返回值类型也为long。

32

ObjDoubleConsumer

接受一个object类型和一个double类型的输入参数,无返回值。

33

ObjIntConsumer

接受一个object类型和一个int类型的输入参数,无返回值。

34

ObjLongConsumer

接受一个object类型和一个long类型的输入参数,无返回值。

35

Predicate

接受一个输入参数,返回一个布尔值结果。

36

Supplier

无参数,返回一个结果。

37

ToDoubleBiFunction

接受两个输入参数,返回一个double类型结果

38

ToDoubleFunction

接受一个输入参数,返回一个double类型结果

39

ToIntBiFunction

接受两个输入参数,返回一个int类型结果。

40

ToIntFunction

接受一个输入参数,返回一个int类型结果。

41

ToLongBiFunction

接受两个输入参数,返回一个long类型结果。

42

ToLongFunction

接受一个输入参数,返回一个long类型结果。

43

UnaryOperator

接受一个参数为类型T,返回值类型也为T。

总结

函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口是为了 lambda 表达式服务,函数式接口的存在是 lambda 表达式出现的前提,lambda 表达式想关于重写了函数式接口中的唯一方法。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java语言实现非递归实现树的前中后序遍历总结
下一篇:微服务如何实现接口文档(如何调用微服务接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~