浅析Java8新特性Lambda表达式和函数式接口

Lambda表达式理解为是 一段可以传递的代码。最直观的是使用Lambda表达式之后不用再写大量的匿名内部类,简化代码,提高了代码的可读性

什么是Lambda表达式,java8为什么使用Lambda表达式?

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。我们可以把 Lambda表达式理解为是 一段可以传递的代码。最直观的是使用Lambda表达式之后不用再写大量的匿名内部类,简化代码,提高了代码的可读性。

// 启动一个线程,不使用Lambda表达式 new Thread(new Runnable() { @Override public void run() { System.out.println("启动一个线程"); } }).start(); //使用Lambda表达式,只需要一行代码 new Thread(() -> System.out.println("启动一个线程")).start();

Lambda表达式的基本语法和格式

基本语法

java8中引入了新的操作符”->”,称为箭头操作符或者lambda操作符,箭头操作符将lambda拆分为两部分,左侧:lambda表达式的参数列表,右侧:lambda表达式中的所需要执行的的功能(接口实现的功能代码)。

lambda表达式需要“函数式接口”的支持,接口中只有一个抽象方法的接口称为函数式接口,可以使用注解@FunctionalInterface检查接口是否是函数式接口。

lambda表达式的参数列表的数据类型可以省略不写,因为jvm编辑器可以通过上下文判断。

基本格式

① 无参数,无返回值。( ) -> System.out.println(“hello”)

// 实现Runnable接口(无参,无返回) Runnable r = () -> System.out.println("hello lambda");

一个参数(小括号可以省略不写,习惯上加上小括号),无返回值。(x) -> System.out.println(x)

//Consumer接口(一个参数,无返回值),之后会提到 //第一种,小括号不省略 Consumer c = (x) -> System.out.print(x); c.accept("hello"); //小括号省略 Consumer c1 = x -> System.out.print(x); c1.accept("hello")

③ 有多个参数,并且lambda有多条语句,则lambda语句必须用大括号括起来并有return返回(若有一条语句则可以省略大括号和return),有返回值。(x,y) ->{System.out.println(“hello”);return Integer.compare(x, y);};

//Comparator接口 //多条语句 Comparator comparator = (x,y) ->{ System.out.println("hello"); return Integer.compare(x, y); }; //一条语句 Comparator comparator2 = (x,y) -> Integer.compare(x, y); System.out.println(comparator2.compare(23, 22));

还有其他的一些格式都是大同小异,这里就不再了解。

函数式接口是什么?

在前面也提到了函数接口,那么函数接口到底是什么呢?是个接口,只包含一个抽象方法,那么它就是函数式接口,我们可以在任意函数式接口上使用 @FunctionalInterface 检查它是否是一个函数式接口。

函数式接口里是可以包含方法、静态方法,他们不是抽象方法;也可以包含java.lang.Object里的public方法,因为任何一个类都继承Object类,包含了来自java.lang.Object里对这些抽象方法的实现,也不属于抽象方法函数式接口里允许子接口继承多个父接口,但每个父接口中都只能存在一个抽象方法,且必须的相同的抽象方法

Java8内置函数式接口

四大核心函数式接口

函数式接口

方法

参数类型

返回类型

作用

Consumer 消费型接口

void accept(T t)

T

void

对T类型的参数进行操作

supplier 供给型接口

T get()

T

操作数据,返回T类型的结果

Function 函数型接口

R apply(T t)

T

R

对T类型参数进行操作,并返回R类型的结果

Predicate 断定型接口

boolean test(T t)

T

boolean

确定T类型参数是否满足某约束,并返回boolean值

//Consumer 消费型接口 @Test public void test1(){ Consumer c = (x) -> System.out.println("hello:"+x+"!"); c.accept("Java"); } // supplier 供给型接口 @Test public void test2(){ supplier s = () -> "hello,beautiful girl"; String str = s.get(); System.out.println(str); } //Function 函数性接口 @Test public void test3(){ Function f= (x) -> x.length(); Integer len = f.apply("hello"); System.out.println(len); } //Predicate 断言型接口 @Test public void test4(){ Predicate p = (x) -> x.length()>5; boolean b = p.test("hello Java"); System.out.println(b); }

其它函数式接口

函数式接口

方法

参数类型

返回类型

作用

BiFunction

R apply(T t, U u)

T, U

R

对 T, U 类型的参数进行操作,并返回R类型的结果

UnaryOperator (Function 子接口)

T apply(T t)

T

T

对 T类型的参数进行一元运算,并返回R对象的结果

BinaryOperato (BiFunction 子接口) )

T apply(T t1, T t2

T, T

T

对T类型的参数进行二元运算,并返回T类型的结果

BiConsumer

void accept(T t, U u)

T, U

void

对T,作

ToIntToIntFunction ToLongFunction TodoubleFunctionint(long,double) applyAsInt(T value)

T

int, long, double

计 算 int 、 long 、double值的函数

IntFunction LongFunction DoubleFunction

R apply(int(long,double) value)

int, long, double

R

参数分别为int、long、double 类型的函数

总结

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...