Lambda简介

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

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

对接口的要求

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

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

@FunctionalInterface

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

Lambda 基础语法

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

/**多参数无返回*/@FunctionalInterfacepublic interface NoReturnMultiParam {    void method(int a, int b);}

/**无参无返回值*/@FunctionalInterfacepublic interface NoReturnNoParam {    void method();}

/**一个参数无返回*/@FunctionalInterfacepublic interface NoReturnOneParam {    void method(int a);}

/**多个参数有返回值*/@FunctionalInterfacepublic interface ReturnMultiParam {    int method(int a, int b);}

/*** 无参有返回*/@FunctionalInterfacepublic interface ReturnNoParam {    int method();}

/**一个参数有返回值*/@FunctionalInterfacepublic interface ReturnOneParam {    int method(int a);}

语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 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 语法简化

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

import lambda.interfaces.*;

public class Test2 {    public static void main(String[] args) {

        //1.简化参数类型,可以不写参数类型,但是必须所有参数都不写        NoReturnMultiParam lamdba1 = (a, b) -> {            System.out.println("简化参数类型");        };        lamdba1.method(1, 2);

        //2.简化参数小括号,如果只有一个参数则可以省略参数小括号        NoReturnOneParam lambda2 = a -> {            System.out.println("简化参数小括号");        };        lambda2.method(1);

        //3.简化方法体大括号,如果方法条只有一条语句,则可以胜率方法体大括号        NoReturnNoParam lambda3 = () -> System.out.println("简化方法体大括号");        lambda3.method();

        //4.如果方法体只有一条语句,并且是 return 语句,则可以省略方法体大括号        ReturnOneParam lambda4 = a -> a+3;        System.out.println(lambda4.method(5));

        ReturnMultiParam lambda5 = (a, b) -> a+b;        System.out.println(lambda5.method(1, 1));    }}

Lambda 表达式常用示例

lambda 表达式引用方法

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

语法

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

public class Exe1 {    public static void main(String[] args) {        ReturnOneParam lambda1 = a -> doubleNum(a);        System.out.println(lambda1.method(3));

        //lambda2 引用了已经实现的 doubleNum 方法        ReturnOneParam lambda2 = Exe1::doubleNum;        System.out.println(lambda2.method(3));

        Exe1 exe = new Exe1();

        //lambda4 引用了已经实现的 addTwo 方法        ReturnOneParam lambda4 = exe::addTwo;        System.out.println(lambda4.method(2));    }

    /**     * 要求     * 1.参数数量和类型要与接口中定义的一致     * 2.返回值类型要与接口中定义的一致     */    public static int doubleNum(int a) {        return a * 2;    }

    public int addTwo(int a) {        return a + 2;    }}

构造方法的引用

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

interface ItemCreatorBlankConstruct {    Item getItem();}interface ItemCreatorParamContruct {    Item getItem(int id, String name, double price);}

public class Exe2 {    public static void main(String[] args) {        ItemCreatorBlankConstruct creator = () -> new Item();        Item item = creator.getItem();

        ItemCreatorBlankConstruct creator2 = Item::new;        Item item2 = creator2.getItem();

        ItemCreatorParamContruct creator3 = Item::new;        Item item3 = creator3.getItem(112, "鼠标", 135.99);    }}

lambda 表达式创建线程

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

    Thread t = new Thread(() -> {      for (int i = 0; i 10; i++) {        System.out.println(2 + ":" + i);      }    });      t.start();

遍历集合

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

    @FunctionalInterface    public interface Consumer<T> {        void accept(T t);        //....    }
      ArrayList list = new ArrayList<>();      Collections.addAll(list, 1,2,3,4,5);//lambda表达式 方法引用list.forEach(System.out::println);list.forEach(element -> {if (element % 2 == 0) {          System.out.println(element);        }      });

删除集合中的某个元素

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

      ArrayList items = new ArrayList<>();      items.add(new Item(11, "小牙刷", 12.05 ));      items.add(new Item(5, "日本马桶盖", 999.05 ));      items.add(new Item(7, "格力空调", 888.88 ));      items.add(new Item(17, "肥皂", 2.00 ));      items.add(new Item(9, "冰箱", 4200.00 ));      items.removeIf(ele -> ele.getId() == 7);//通过 foreach 遍历,查看是否已经删除      items.forEach(System.out::println);

集合内元素的排序

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

        ArrayList list = new ArrayList<>();list.add(new Item(13, "背心", 7.80));list.add(new Item(11, "半袖", 37.80));list.add(new Item(14, "风衣", 139.80));list.add(new Item(12, "秋裤", 55.33));/*        list.sort(new Comparator() {@Override            public int compare(Item o1, Item o2) {                return o1.getId()  - o2.getId();            }        });        */list.sort((o1, o2) -> o1.getId() - o2.getId());        System.out.println(list);

Lambda 表达式中的闭包问题

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

import java.util.function.Consumer;public class Main {    public static void main(String[] args) {

        int num = 10;

        Consumer<String> consumer = ele -> {            System.out.println(num);        };

        //num = num + 2;        consumer.accept("hello");    }}

海向

cnblogs.com/haixiang/p/11029639.html

lambda表达式_Lambda表达式详解相关推荐

  1. Java中Lambda表达式使用及详解

    Java中Lambda表达式使用及详解 前言 一.Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中.使 ...

  2. el表达式ne什么意思_JSP中EL表达式的用法详解(必看篇)

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  3. Java Web中的EL(表达式语言)详解

     Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...

  4. 神经网络的函数表达式,神经网络公式详解pdf

    1.神经网络的准确率是怎么计算的? 其实神经网络的准确率的标准是自己定义的. 我把你的例子赋予某种意义讲解: 1,期望输出[1 0 0 1],每个元素代表一个属性是否存在.像着4个元素分别表示:是否肺 ...

  5. EL表达式 JSTL(详解)

    相关JSTL.EL博客收集如下: JSTL 标签大全详解:http://blog.csdn.net/qq_25827845/article/details/53311722 EL表达式详解:http: ...

  6. C语言:表达式求值详解

    文章目录 前言 一.隐式类型转换 二.算术转换 三.操作符的属性 前言 该篇文章是笔者之前一篇文章C语言操作符详解的后续补充: 表达式求值的顺序一部分是由操作符的优先级和结合性决定. 同样,有些表达式 ...

  7. C程序语言表达式运算顺序,详解C++编程中表达式的语义与计算顺序

    表达式根据其运算符的优先级和分组来计算. 计算顺序请看以下示例: // expre_pluslang__pluslang_Order_of_Evaluation.cpp // compile with ...

  8. 学习ES6(六)--函数 Lambda函数(=) 详解

    函数是可读,可维护和可重用代码的构建块.使用function关键字定义功能.以下是定义标准函数的语法. function function_name() { // function body } 要强 ...

  9. lambda ::表达式_Lambda表达式和流API:基本示例

    lambda ::表达式 这篇博客文章包含基本Lambda表达式和Stream API示例的列表,我在2014年6月在Java用户组Politechnica Gedanensis (格但斯克技术大学) ...

最新文章

  1. centos ruby通过rvm更新版本
  2. IDEA如何重新刷新pom.xml文件重新下载
  3. 5.Boost之“资源申请即初始化” RAII
  4. (原)各种输入框美化
  5. 硬盘检测工具Smartmontools安装、部署、使用
  6. php函数scandir_PHP函数glob:扫描目录文件更好的方式
  7. ES6语法---let和var的不同
  8. zedboard板子上呼吸灯的实现(第一版)仿真代码的实现
  9. 【问题】ajax两种传递id值方式的区别
  10. DOS及BIOS中断调用实验
  11. 兰勃特等角圆锥投影的双标准纬线的选择
  12. 实例88:构建InfoGAN生成MNIST模拟数据
  13. 基于ATmega128单片机的LCD12864显示密码锁
  14. FFmpeg硬件加速
  15. 人脸识别摄像头与普通摄像头的区别
  16. Protues 汇编报错所选编译器MASM32未安装编译失败可以这样解决
  17. 全新2021款 Jlink隔离器,ARM仿真器隔离,Jlink,Nu-link,ULINK的隔离,Cortex-M系列隔离仿真
  18. 手机如何打开html文件怎么打开,怎么在手机上打开HTML文件怎么打开
  19. 前端高级进阶13本经典书籍
  20. 计算机开机主机无法启动,手把手教你电脑无法启动怎么办

热门文章

  1. 使用Java代码在SAP Marketing Cloud上创建Contact数据
  2. Product Master data in C4C and data exchange with CRM via PI
  3. where is page layout xml template being initialized - hard code in ctr
  4. ABAP Netweaver里的那些月亮
  5. nodejs应用部署到SAP云平台的经过
  6. My appointment应用点了Edit后的roundtrip分析
  7. Marketing Cloud里取得系统contact数目的API
  8. SAP OData CSRF token的后台验证源代码
  9. intx update task - IB_IBINTX_UPDATE
  10. 为什么CRM WebClient UI每次点了回车都会触发到后台的roundtrip