Lambda表达式入门,看这篇就够了!

Lambda表达式入门,看这篇就够了!

转自Python日常笔记

作者:海向

cnblogs.com/haixiang/p/11029639.html

Lambda简介

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

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

对接口的要求

虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法

jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。

@FunctionalInterface

修饰函数式接口的,要求接口中的抽象方法只有一个。这个注解往往会和 lambda 表达式一起出现。

Lambda 基础语法

我们这里给出六个接口,后文的全部操作都利用这六个接口来进行阐述。

语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符 ,读作(goes to)。

import lambda.interfaces.*;
public class Test1 {    public static void main(String[] args) {        //无参无返回        
  NoReturnNoParam noReturnNoParam = () -> {            System.out.println("NoReturnNoParam");        };        noReturnNoParam.method();        
  //一个参数无返回        
  NoReturnOneParam noReturnOneParam = (int a) -> {            System.out.println("NoReturnOneParam param:" + a);        };        noReturnOneParam.method(6);        
  //多个参数无返回        
  NoReturnMultiParam noReturnMultiParam = (int a, int b) -> {            System.out.println("NoReturnMultiParam param:" + "{" + a +"," + + b +"}");        };        noReturnMultiParam.method(6, 8);        
  //无参有返回值        
  ReturnNoParam returnNoParam = () -> {            System.out.print("ReturnNoParam");            return 1;        };        int res = returnNoParam.method();        System.out.println("return:" + res);        
  //一个参数有返回值        
  ReturnOneParam returnOneParam = (int a) -> {            System.out.println("ReturnOneParam param:" + a);            return 1;        };        int res2 = returnOneParam.method(6);        System.out.println("return:" + res2);       
   //多个参数有返回值        
  ReturnMultiParam returnMultiParam = (int a, int b) -> {            System.out.println("ReturnMultiParam param:" + "{" + a + "," + b +"}");            return 1;        };        int res3 = returnMultiParam.method(6, 8);        System.out.println("return:" + res3);    
  }
}

Lambda 语法简化

我们可以通过观察以下代码来完成代码的进一步简化,写出更加优雅的代码。


Lambda 表达式常用示例

lambda 表达式引用方法

有时候我们不是必须要自己重写某个匿名内部类的方法,我们可以可以利用 lambda表达式的接口快速指向一个已经被实现的方法。

语法

方法归属者::方法名 静态方法的归属者为类名,普通方法归属者为对象

构造方法的引用

一般我们需要声明接口,该接口作为对象的生成器,通过 类名::new 的方式来实例化对象,然后调用方法返回对象。详细版:Lambda完整学习指南

lambda 表达式创建线程

我们以往都是通过创建 Thread 对象,然后通过匿名内部类重写 run() 方法,一提到匿名内部类我们就应该想到可以使用 lambda 表达式来简化线程的创建过程。

遍历集合

我们可以调用集合的public void forEach(Consumer action) 方法,通过 lambda 表达式的方式遍历集合中的元素。以下是 Consumer 接口的方法以及遍历集合的操作。Consumer 接口是 jdk 为我们提供的一个函数式接口。

删除集合中的某个元素

我们通过public boolean removeIf(Predicate filter)方法来删除集合中的某个元素,Predicate 也是 jdk 为我们提供的一个函数式接口,可以简化程序的编写。

集合内元素的排序

在以前我们若要为集合内的元素排序,就必须调用 sort 方法,传入比较器匿名内部类重写 compare 方法,我们现在可以使用 lambda 表达式来简化代码。

Lambda 表达式中的闭包问题

这个问题我们在匿名内部类中也会存在,如果我们把注释放开会报错,告诉我 num 值是 final 不能被改变。这里我们虽然没有标识 num 类型为 final,但是在编译期间虚拟机会帮我们加上 final 修饰关键字。

你可能感兴趣的:(Lambda表达式入门,看这篇就够了!)