JDK1.8新增特性之Lambda表达式概念及代码呈现

Lambda表达式是Java 1.8的重要特性,它允许我们将代码视作数据来处理,简化了匿名内部类的使用。Lambda操作符"->"分为参数列表和函数体两部分,参数类型由编译器推断。由于其依赖类型推断,Lambda能在函数式接口上调用,Java提供了四大核心函数式接口。应用Lambda表达式需确保接口仅有一个抽象方法,可以使用@FunctionalInterface注解进行验证。
摘要由CSDN通过智能技术生成

概念:Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("这是一个匿名内类的形式");
            }
        };
---------------------------------------------------------
上面是一个匿名内部内的常见格式,可用下面的Lambda表达式进行替代
---------------------------------------------------------
 Runnable runnable = () -> System.out.println("这是一个匿名内类的形式");

上例可以看出Lambda表达式作为参数传递比匿名内部类更加便捷,Lambda语法规则为:

Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “ ->” , 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:

左侧: 指定了 Lambda 表达式需要的所有参数
右侧: 指定了 Lambda 体,即 Lambda 表达式要执行的功能。

//采用匿名内部类传参
 new TreeSet<Integer>(new Comparator<Integer>() {
           @Override
           public int compare(Integer a, Integer b) {
               return a+b;
           }
       });
--------------------------------------------------------------

--------------------------------------------------------------
//采用Lambda传参
 new TreeSet<Integer>((a, b) -> a+b);
//可看出lambda表达式更加简洁,同时(a, b)代表接口方法中需要传递的参数,a+b为接口方法的具体体现,也就是方法的主体。其中小括号内的参数类型可写可不写,当Lambda语句只有一条内容时,{}和return可写可不写

上述 Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”.

上程序示例为函数式接口(定义:只包含一个抽象方法的接口,称为函数式接口),只有是函数式接口,我们才能用Lambda表达式(Lambda表达式需要函数式接口的支持),判断是否为函数式接口,我们可以在任意函数式接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口.

Java提供四大核心函数式接口

函数式接口参数类型返回类型用途
Consumer<T>  消费型接口Tvoid对类型为T的对象应用操作,包含方法:void accept(T t);
Supplier<T>   供给型接口T

返回类型为T的对象,包含方法:

T get();

Function<T,R>  函数型接口TR

对类型为T的对象应用操作,并返回结果。结果是R类型的对象,包含方法:

R apply(T t);

Predicate<T>  断言型接口Tboolean

确定类型为T的对象是否满足某约束,并返回boolean的值,包含方法 

boolean Test(T t);

 

其他函数式接口(自己查API):

BiFunction<T,U,R>    
UnaryOperator<T>(Function的子接口)
BinaryOperator<T>(BiFunction的子接口)
BiConsumer<T,U>
ToIntFunction<T>
ToLongFunction<T>
ToDoubleFunction<T>
IntFunction<R>
LongFunction<R>
DoubleFunction<R>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值