美文网首页
Java8-Lambda表达式

Java8-Lambda表达式

作者: 龙历旗 | 来源:发表于2017-08-20 19:36 被阅读0次

什么是Lambda表达式

Lambda可以理解为是一个匿名函数,Lambda表达式可以说是一段可以传递的代码。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

在Java8以前,我们是通过接口来传递代码的(面向接口的编程)。
比如:

 Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("run----");
            }
        };

 Thread th = new Thread(runnable);

这里Thread类需要的其实并不是Runnable对象,而是它的方法

public abstract void run();

但是没有办法直接传递方法,只能通过接口来传递。

Java8提供了一种新的紧凑的传递代码的语法--就是Lambda表达式。比如刚才的Thread可以用lambda表达式修改为:

Runnable runnable = (() -> System.out.println("run----"));
Thread th = new Thread(runnable);
//还可以继续简化
Thread t = new Thread(() -> System.out.println("run----"));

是不是简洁多了?。

1.Lambda表达式语法

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

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

语法格式:

1). 无参,无返回值,Lambda体只需一条语句

Runnable runnable = (() -> System.out.println("run----"));

2). Lambda需要一个参数

Consumer<String> consumer = ((str) -> System.out.println(str));
//只有一个参数时,参数小括号可以省略,如下
Consumer<String> consumer = (str -> System.out.println(str));

3). Lambda 需要两个参数,并且有返回值

Comparator<Integer> comparator = ((num1, num2) -> {
   return num1 - num2;
});
//当表达式内只有一条语句时,return和大括号可以省略,如下
Comparator<Integer> comparator = ((num1, num2) -> num1 - num2);

4). 数据类型可以省略,因为可由编译器推断得出,称为“类型推断”

BinaryOperator<Long> binaryOperator = ((Long num1, Long num2) -> num1 + num2);
//(Long l1, Long l2) 中参数类型可以省略,编译器可以自动推断,如下↓
BinaryOperator<Long> binaryOperator = ((num1, num2) -> num1 + num2);

可以看出,相比匿名内部类,传递代码变得更为直观,不再有实现接口的模板代码,不再声明方法,也名字也没有,而是直接给出了方法的实现代码

2.变量引用

​ 与匿名内部类类似,Lambda表达式也可以访问定义在主体代码外部的变量,但对于局部变量,它也只能访问final类型的变量,与匿名内部类的区别是,它不要求变量声明为final,但变量事实上不能被重新赋值。比如:

Integer num = 1;
Function<Integer, Integer> function = (integer -> num);

可以访问局部变量num,但num不能被重新赋值,如果这样写:

Integer num = 1;
Function<Integer, Integer> function = (integer -> num++);
//编译器报错
//Variable used in lambda expression should be final or effectively final

与匿名内部内比较

从以上内容可以看出,Lambda表达式与匿名内部类很像,主要就是简化了语法,使得编写更加简单,但Lambda与匿名内部类不同的是,java会为每个匿名内部类生成一个一个类,而Lambda表达式不会。

Lambda表达式不是匿名内部类,那它的类型到底是什么呢?是函数式接口

小结

​ 本章介绍了Lambda表达式,Lambda语法以及在Lambda表达式中的变量引用。

原文链接 : Java8 新特性 Lambda表达式 | 火尧

相关文章

  • Java8-Lambda

    Java8-Lambda Java 8 的最大变化是引入了 Lambda 表达式——一种紧凑的、传递行为的方式 引...

  • java8-lambda表达式

    为什么要使用java8: Java 几个重大版本 :Java 从 1995 年发布到现在,也走过 18 年了,个人...

  • Java8-Lambda表达式

    Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambd...

  • Java8-Lambda表达式

    Lambda表达式,它可以很简洁地表示一个行为或传递代码,现在你可以把Lambda表达式看作匿名功能,它基本上就是...

  • Java8-Lambda表达式

    什么是Lambda表达式 Lambda可以理解为是一个匿名函数,Lambda表达式可以说是一段可以传递的代码。可以...

  • JAVA8-lambda表达式

    1.(Person p) -> p.getGender() == Person.Sex.MALE && p.get...

  • Java8-lambda表达式

    匿名接口方法 方法引用 集合排序与遍历 匿名排序比较 系统内置的一些函数式接口 闭包中使用的变量变final修饰的...

  • java8-Lambda表达式

    Lambda表达式可以理解为匿名函数的一种方式:匿名 -- 说匿名,是因为它不像普通的方法那样有一个明确的方法名称...

  • java8-lambda表达式

    Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,...

  • Java8-lambda表达式.md

    Lambda 表达式详解 函数式编程 函数式接口(functional interface 也叫功能性接口,其实是...

网友评论

      本文标题:Java8-Lambda表达式

      本文链接:https://www.haomeiwen.com/subject/putqdxtx.html