Java8 新特性之Lambda表达式以及函数式接口

分手后的思念是犯贱 2022-02-15 03:28 343阅读 0赞

1.Lambda表达式的意义与构建规则

Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念。

简单的结构:

(参数1->表达式1)

((参数1,参数2,..)->{表达式1;表达式2 ;..})

显示指定参数类型:

((String 参数1,String 参数2,..)->{表达式1;表达式2 ;..})

可以看到:如果是多个参数则必须用(),多行表达式要用{},并且用;隔开

最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:

Arrays.asList( “a”, “b”, “d” ).forEach( e -> System.out.println( e ) );

首先Arrays.asList( “a”, “b”, “d” )是将数组转为list因为数组不是object类型的不能直接.(点)出来方法,通过list来调用forEach方法,一个参数e,一行代码块System.out.println( e ),则省略了很多东西,完整的写法应该是:

Arrays.asList( “a”, “b”, “d” ).forEach((String e)->{System.out.println(e);});

2.函数式接口

Runnable接口就是标准的函数式接口,那么具体的定义:

函数式接口就是只定义一个自己的抽象方法的接口.隐藏的规则:

  • 所有的接口都继承了object的方法,所以继承了object的方法不是自己的抽象方法
  • 默认方法与静态方法不是抽象方法
  • 可以用@FunctionalInterface进行标明该接口是函数式接口,也可以不标注,但是表中之后可以自动检测该接口是否符合函数式接口的定义,类似于泛型的使用,编译的时候就可以检测出来.

例如:

@FunctionalInterface

public interface ILambda {

int add(Integer o1, Integer o2);

boolean equals(Object obj);

int hashCode();

}

就是一个函数式接口.

3.Lambda表达式的使用

通过配合函数式接口我们可以更清晰的明白如何使用lambda表达式

使用上述的函数式接口,我们可以这样使用:

public class Test {

public static void main(String[] args) {

ILambda lambda=(a,b) -> a+b;

Integer cInteger= lambda.add(1, 2);

System.out.println(cInteger);

}

}

可以看到,lambda表达式就是add方法的实现,准确的说箭头后面的代码块才是真正的add方法的实现,

这个代码块是我们根据业务需求临时定义的,极大的提高了代码的灵活性,我们完全可以根据需求的变动而实现不同的代码块,而不需要修改其他的代码;

具体的逻辑:

根据函数式接口的定义,只有一个抽象方法,那么我们就可以知道,lambda表达式就是这个抽象方法的实现(或者说是实例),这就是行为参数化.

注意:

这个lambda表达式必须是符合抽象方法定义的,也就是所上述的两个参数必须是Integer类型的,不能显示的定义为其他类型,当然后面的代码块中两个参数的行为也必须是符合Integer类型的.另外,如果代码块只有一行,则可以省略返回值,如果多行需要显示的return返回值,返回值类型也要符合抽象方法的声明.

欢迎参看原文:http://www.poppyflower.cn/?p=127

发表评论

表情:
评论列表 (有 0 条评论,343人围观)

还没有评论,来说两句吧...

相关阅读