Lambda表达式是Java 8的重要更新,一个被广大开发者期待已久的新特性。Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。

//接口,用于封装处理行为。因为暂时无法确定处理行为,所以是空方法体
interface Command {
    void process(int[] target);
}

//处理数组
class ProcessArray {
    public void process( int[] target, Command cmd ) {
        cmd.process(target);
    }
}

public class Test {

    public static void main(String[] args) {
        ProcessArray pa = new ProcessArray();

        int[] target = {3,-4,6,4};

        pa.process(target, new Command() {
            public void process(int[] target) {
                int sum = 0;
                for( int tmp : target ) {
                    sum+=tmp;
                }
                System.out.println("Summary:"+sum);
            }
        });
    }
}

ProcessArray类的process()方法处理数组时,希望可以动态传入一段代码作为具体的处理行为,因此程序创建了一个匿名内部类实例来封装处理行为。但为了向process()方法传入这段代码,程序不得不使用匿名内部类的语法来创建对象。

Lambda表达式完全可用于简化创建匿名内部类对象,因此可将上面代码改为如下形式。

interface Command {
    void process(int[] target);
}

class ProcessArray {
    public void process( int[] target, Command cmd ) {
        cmd.process(target);
    }
}

public class Test {

    public static void main(String[] args) {
        ProcessArray pa = new ProcessArray();

        int[] array = {3,-4,6,4};

        pa.process(array,(int[]target)->{
            int sum = 0;
            for( int tmp:target ) {
                sum+=tmp;
            }
            System.out.println("Summary:"+sum);
        });
    }
}

从上面程序中可以看出,这与创建匿名内部类时需要实现的方法完全相同,只是不需要new Xxx(){}这种繁琐的代码,不需要指出重写的方法名字,也不需要给出重写的方法的返回值类型——只要给出重写的方法括号以及括号里的形参列表即可。

当使用Lambda表达式代替匿名内部类创建对象时,Lambda表达式的代码块将会代替实现抽象方法的方法体,Lambda表达式就相当于一个匿名方法。


小结

Lambda表达式的主要作用就是代替匿名内部类的繁琐语法。它由三部分组成。

  • 形参列表:形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。

  • 箭头->

  • 代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号。代码块只有一条return语句,甚至可以省略return 关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。

下面示范了Lambda表达式的几种简化写法。

interface Eatable {
    void taste();
}

interface Flyable {
    void fly( String weather );
}

interface Addable {
    int add(int a, int b);
}

public class Test {

    public void eat( Eatable e ) {
        System.out.println(e);
        e.taste();
    }

    public  void drive( Flyable f ) {
        System.out.println("我正在驾驶:"+f);
        f.fly("碧空如洗的晴日");
    }

    public void test (Addable add) {
        System.out.println("5+3="+add.add(5,3));
    }

    public static void main(String[] args) {
        Test t = new Test();

        //Lambda语句只有一条语句,可以省略花括号
        t.eat(()->System.out.println("苹果的味道不错!"));

        //只有一个形参,可以省略圆括号
        t.drive( weather-> {
            System.out.println("今天天气是:"+weather);
            System.out.println("直升机飞行平稳");
        });

        //只有一条语句,可以省略return
        t.test((a,b)->a+b);
    }
}

Lambda表达式概念与基本语法的更多相关文章

  1. java中使用Lambda表达式的5种语法

    1,标准写法 思考下述情况: String[] arr = {"program", "creek", "is", "a" ...

  2. JAVA8之lambda表达式具体解释,及stream中的lambda使用

    前言: 本人也是学习lambda不久,可能有些地方描写叙述有误,还请大家谅解及指正! lambda表达式具体解释 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.l ...

  3. C#进阶之全面解析Lambda表达式

    引言 在实际的项目中遇到一个问题,我们经常在网上搜索复制粘贴,其中有些代码看着非常的简洁,比如Lambda表达式,但是一直没有去深入了解它的由来,以及具体的使用方法,所以在使用的时候比较模糊,其次,编 ...

  4. JAVA8之lambda表达式详解

    原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...

  5. 对比讲解lambda表达式与传统接口函数实现方式

    在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应该都掌握了,实际上还是存在大量的 ...

  6. 【C++】C++中的lambda表达式和函数对象

    目录结构: contents structure [-] lambda表达式 lambda c++14新特性 lambda捕捉表达式 泛型lambda表达式 函数对象 函数适配器 绑定器(binder ...

  7. 恕我直言你可能真的不会java第1篇:lambda表达式会用了么?

    本文配套教学视频:B站观看地址 在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应 ...

  8. java8的新特性之lambda表达式和方法引用

    1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...

  9. Lambda表达式【转】

    lambda表达式是对匿名方法的一种改进,具有更加简洁的语法和更易理解的形式,lambda表达式可以包括表达式和语句,并且可以用与创建委托或表达式目录树类型. lambda表达式都使用Lambda运算 ...

随机推荐

  1. 我的第一个python web开发框架(38)——管理员管理功能

    后台管理员的管理功能,它主要用来管理后台的登录账号,绑定权限,当然如果想将后台管理扩展成企业相关管理系统,比如用于公司人事管理,在这个基础上进行适当扩展就可以了. 我们先看看界面效果(也可以看着数据字 ...

  2. 做嵌入式,C语言相关的朋友不要错过

    前言 相对来讲嵌入式相关的人群总体来说比较少,那么有没有一个聚集地呢? 为回馈读者,「编程珠玑」与「嵌入式linux」,「EmbeddDeveloper」三个公众号联合组织了此次福利活动,「编程珠玑」 ...

  3. 【spring源码分析】IOC容器初始化(十一)

    前言:前面分析了doCreateBean中的createBeanInstance函数,接下来分析其剩余流程. 首先贴上doCreateBean函数: // AbstractAutowireCapabl ...

  4. R语言学习——数据合并及绘制密度分布曲线图

    setwd("E:/08_cooperation/07_X-lab/06-Crosstalk/Aadapter_primer")# 读取lane01.txt,并对其按列进行相加处理 ...

  5. Pyinstaller 打包exe

    安装 ​ pip insatll Pyinstaller 参数 pyinstaller -Fw main.py 参数 概述 -F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的 ...

  6. C语言函数的格式

    #include <stdio.h>#include <stdlib.h>extern int addf(int a,int b);//函数能多次声明//int addf(in ...

  7. 使用VScode配合chrome实现网页自动刷新

    1.使用插件:livereload 2.VScode商店中搜索上述插件安装 3.Chrome商店中搜素上述插件安装 并设置允许访问文件网址: 4.在两方插件都打开的情况下,VScode中按下ctrl+ ...

  8. Map的clear与new Map的区别

    对于clear与new Map的区别.我们首先来看一个例子,本例子是我在实际开发中遇到的,需求就是讲map放入到list中,说白了就是list转map,有两种实现方式,分别是: // 方案一 Map& ...

  9. Vuex 存储||获取后台接口数据

    如果你对 Vuex 有一定的了解的话呢,可以继续这一篇的学习了,如果没有的话, 建议先看一看我的上一篇 Vuex基础:地址在下面 Vuex的详解与使用 Vuex刷新数据不丢失 这篇接着上一篇: 这篇将 ...

  10. JS学习笔记:(二)回流和重绘

    在搞清楚回流和重绘的概念之前,我们要清除浏览器的渲染过程. 解析生成DOM Tree(此时包含所有节点,包括display:none); 根据CSS Object Module(CCSSOM)计算节点 ...