JAVA 8 Lambda表达式-Lambda Expressions

Lambda表达式介绍

Lambda表达式是在java规范提案JSR 335中定义的,Java 8 中引入了Lambda表达式,并被认为是Java 8最大的新特性,Lambda表达式促进了函数式编程,简化了Java编程开发。

背景知识

匿名内部类

在Java中,匿名内部类一般适用于那些在Java应用中只会出现一次的实现类,举个例子,在标准的Swing或JavaFX应用中,有很多键盘和鼠标的事件处理程序,一般情况下,你不需要写一个单独的事件处理类,而是使用如下方式(有Swing编程经验的应该很熟悉吧):

        JButton testButton = new JButton("Test Button");
        testButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                System.out.println("Click Detected by Anon Class");
            }
        });

不这样做的话,你需要针对每一个事件写一个单独的ActionListener接口的实现类,这样的代码并不优雅,因为仅仅为了定义一个方法就需要附加写一大堆的代码。通常,哪里需要,就在哪里创建对应的匿名内部类,这样的代码可读性会更强。

Functional Interfaces函数式接口

首选,我们来观察下上面提到的ActionListener接口的定义,如下:

package java.awt.event;

import java.util.EventListener;

public interface ActionListener extends EventListener {

    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e);

}

在上面的代码中,只定义了一个方法,在Java 8中,像这样的接口被称为“functional interface”。通常在Java中,我们经常使用匿名内部类来实现函数式接口,这是一种很常见的使用模式;

另外,在JDK中,除了ActionListener接口外,类似的还有Runnable和Comparator接口。

Lambda表达式语法

Lambda表达式的语法形式如下:

parameter -> expression body

主要组成:参数列表 + 箭头 + 表达式体,如 (int x, int y) -> x + y

其中,表达式体可以是一条表达式,也可以是一个语句块(多条代码语句);

Lambda表达式具有如下特征:

  • 【可选】类型声明:参数的类型不需要声明,编译器可以根据参数值推断出其类型;
  • 【可选】括号:单个参数的话,不需要用圆括号包围参数,当然,对于多个参数或无参数的话,括号是需要的;
  • 【可选】花括号:如果表达式主体只有一条语句的话,不需要用花括号包围,当然,对于多条语句,花括号是需要的;
  • 【可选】return关键字:如果表达式主体是单一表达式,return关键字可以不写,编译器可以自动返回该值,当然,如果写了return,则需要加上花括号;

举个例子:

package lambda;

/**
 * LambdaTest
 *
 * @author Pi Chen
 * @version V1.0.0, 2016年9月19日
 * @see
 * @since V1.0.0
 */
public class LambdaTest
{
    public static void main(String args[])
    {
        LambdaTest tester = new LambdaTest();

        // 有参数类型
        MathOperation addition = (int a, int b) -> a + b;

        // 无参数类型
        MathOperation subtraction = (a, b) -> a - b;

        // 有花括号,有return关键字
        MathOperation multiplication = (int a, int b) -> {
            return a * b;
        };

        // 无花括号,无return关键字,单一表达式情况
        MathOperation division = (int a, int b) -> a / b;

        // MathOperation调用示例
        System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
        System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
        System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
        System.out.println("10 / 5 = " + tester.operate(10, 5, division));

        // 有括号
        GreetingService greetService1 = message -> System.out.println("Hello " + message);

        // 无括号,单个参数情况
        GreetingService greetService2 = (message) -> System.out.println("Hello " + message);

        // GreetingService调用示例
        greetService1.sayMessage("Mahesh");
        greetService2.sayMessage("Suresh");

        //有括号, 无参情况
        Runnable runTest = () -> System.out.println("Running");
        //Runnable调用示例
        runTest.run();
    }

    // 内部接口
    interface MathOperation
    {
        int operation(int a, int b);
    }

    interface GreetingService
    {
        void sayMessage(String message);
    }

    interface Runnable
    {
        void run();
    }

    private int operate(int a, int b, MathOperation mathOperation)
    {
        return mathOperation.operation(a, b);
    }
}

关键点说明:

  • Lambda表达式主要用于定义一个函数式接口(functional interface:一个只包含一个方法的接口)的内联实现,在上面的例子中,我们使用了各种类型的Lambda表达式来实现MathOperation接口的operation方法,接着又实现了GreetingService接口的sayMessage方法,Runnable接口的run方法;
  • Lambda表达式消除了匿名类的使用并且赋予Java简单且强大的函数式编程能力;

参考资料

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#overview

https://www.tutorialspoint.com/java8/java8_lambda_expressions.htm

时间: 2024-10-11 05:54:52

JAVA 8 Lambda表达式-Lambda Expressions的相关文章

java8之lambda表达式(lambda表达式语法)

到目前为止,在Java中向其他代码传递一段代码并不是很容易.你不可能将代码块到处传递.由于java是一个面向对象的语言,因此你不得不构建一个属于某个类的对象,由它的某个方法来包含所需的代码. lambda表达式帮我们解决了这个问题,可以直接传递代码块!Java中lambda表达式的格式:参数,箭头(->),以及一个表达式.示例: (String first,String second) -> Integer.compare(first.length(), second.length()) 如果

C++11 lambda表达式(lambda expression)

1.可调用对象(callable object)类别包括: 函数 函数指针 重载了函数调用运算符的类 lambda 表达式 2.lambda表达式形式: [capture list] (parameter list) -> return type { function body } capture list (捕获列表)是一个 lambda 所在函数中定义的局部变量的列表(通常为空),空捕获列表表明此 lambda 不使用它所在的函数中的任何局部变量, return type.parameter

Java 8——Lambda表达式

本篇文章不介绍Lambda的前世今生,这里只对Lambda表达的应用做详细了解.以及与内部类的差异点. Lambda表达式 Lambda表达式是Java SE 8版本中引入的新的语法糖.将功能看做方法参数,将代码看做数据. Lambda表达式语法: LambdaParameters -> LambdaBody Lambda表达式分为三部分: 参数列表 ->符号 函数体 如: () -> {} // 无参,返回结果为空 (x) -> System.out.println(x); //

Java核心技术-接口、lambda表达式与内部类

本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内部类机制:内部类定义在另一个类的内部,其中的方法可以访问包含它们的外部类的域. 代理:一种实现任意接口的对象. 1 接口 1.1 接口的概念 概念:接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义. "如果类遵从某个特定的接口,那么就履行这项服务": Arrays

Effective Java 第三版——43.方法引用优于lambda表达式

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 43.方法引用优于lambda表达式 lambda优于匿名类的主要优点是它更简洁.Java提供了一种生成函数对象的方法,比lambda还要简洁,那就是:方法引用( meth

Java 8 中的 Lambda 表达式

Lambda 表达式是 Java 8 最受欢迎的功能.人们将函数式编程的概念引入了 Java 这门完全面向对象的命令式编程语言. 关于函数式编程是如何运作的,这个话题超出了本文的范围,不过我们会提炼出它一个明显有别于我们所经常使用的 OOP (面向对象编程)的功能来加以讨论. 在本文中, 我们将了解到 lambda 表达式具体是什么东西,还有就是它们是如何将自己融入整个 Java 生态系统的.我们也会对没有使用 lambda 表达式的代码以及后面使用 lambda 进行重构的示例代码进行一下观察

JAVA 8 主要新特性 ----------------(三)新功能Lambda表达式入门

一.简述 Java为了扩充匿名方法在1.8中新追加的特性.本身Java之前的版本是没有匿名方法的,只有匿名对象. 二.使用 Java中使用匿名方法必须要对应接口中的一个抽象方法.(要有一个匿名方法,需要函数去接收它) 三.为什么使用 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升. 四.实例一:从匿名类到 Lamb

关于JAVA核心技术(卷一)读后的思考(lambda表达式的讨论)

lambda表达式 lambda表达式是一个可传递的代码块.可以以后执行一次或者多次.在程序运行中我们经常会遇到传递代码段的情况,但是我们一般都是先构造一个对象,然后通过对象调用相应的代码块来实现传递代码块的目的,这个方法十分繁琐,设计师为解决这个问题,就设计出了lambda表达式. lambda表达式的语法我们可以参考之前写的方法,可以发现如果方法可以分为方法名,参数和方法主体.lambda表达式就是将方法名省去: 标准情况: (参数类型1 参数1,参数类型2 参数2,.....,参数类型n

Lambda表达式和表达式树

在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创