JDK8新特性——Lambda表达式

Lambda简介

Lambda表达式时JDK8的一个新特性,可以取代大部分的匿名内部类,写出更优雅的代码,尤其在集合的便利和其他集合操作中,可以极大地优化代码结构。

JDK也提供了大量的内置函数式接口供我们使用,使得Lambda表达式的运用更加方便、高效。

Lambda语法

(parameters) -> expression
或
(parameters) ->{ statements; }

Lambda有三个部分:一些参数一个箭头一段代码(Lambda主体)

Lambda特征

  • **可选类型声明:**不需要声明参数类型,编译器可以统一识别参数值。
  • **可选的参数圆括号:**一个参数无需定义圆括号,但多个参数或没有需要定义圆括号。
  • **可选的大括号:**如果主体包含了一个语句,就不需要使用大括号。
  • **可选的返回关键字:**如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

Lambda示例

传统代码示例

public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("多线程任务执行");
            }
        };
        new Thread(runnable).start();
    }

说明:

  • Thread类需要Runnable接口作为参数,其中的抽象run方法是用来指定线程任务内容的核心;
  • 为了指定run的方法体,不得不需要Runnable接口的实现类;
  • 为了省去定义一个RunnableImpl实现类的麻烦,不得不使用匿名内部类;
  • 必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;
  • 而实际上,似乎只有方法体才是关键所在

上述示例使用Lambda的写法

new Thread(() -> System.out.println("多线程启动")).start();

上例中,核心代码其实只是如下所示的内容:() -> System.out.println("多线程任务执行!")

使用Lambda

Lambda和函数式接口的结合

为了应用不同的Lambda表达式,我们需要一套能够描述常见函数描述符的函数式接口。Java API中已经有了几个函数式接口,比如ComparatorRunnable,以及Callable。Java 8在java.util.function包中引入了几个新的函数式接口。

常用的有四大函数式接口:

  • Consumer:消费型接口

  • Supplier:供给型接口

  • Function:函数型接口

  • Predicate: 断言型接口

其详细内容参考JDK8 新特性 函数式接口

https://www.imlxy.cn/archives/jdk8新特性函数式接口

函数式接口的提出是为了让我们更加方便的使用lambda表达式,不需要自己再手动创建一个函数式接口,直接拿来用就好了。

方法引用

在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。

当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。方法引用是一种更简洁易懂的Lambda表达式。

注意方法引用是一个Lambda表达式,其中方法引用的操作符是双冒号"::"

简单地说,就是一个Lambda表达式。在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰,Java 8的方法引用允许我们这样做。方法引用是一个更加紧凑,易读的Lambda表达式,注意方法引用是一个Lambda表达式,其中方法引用的操作符是双冒号"::"

更详细的示例请参考:JDK8新特性——方法引用

https://www.imlxy.cn/archives/jdk8新特性方法引用

Stream流

Stream流更简单优雅。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作 。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性.

list.stream() 
    .filter(s -> s.startsWith("张")) 
    .filter(s -> s.length() == 3) 
    .forEach(s -> System.out.println(s));

stream

这里的 filter 、 map 、 skip 都是在对函数模型进行操作,集合元素并没有真正被处理。只有当终结方法 count执行的时候,整个模型才会按照指定策略执行操作。而这得益于Lambda的延迟执行特性。

Stream流的更详细介绍请参考:JDK8新特性——流(Stream)

https://www.imlxy.cn/archives/jdk8新特性流stream

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议