JavaLambda表达式

樵夫2021-09-16 11:56

    Lambda表达式(Lambdaexpression)是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure)。现在很多语言都支持Lambda表达式,如C++、C#、Java、Python和JavaScript等。

JavaLambda表达式

    Lambda表达式是推动Java8发布的重要新特性,它允许把函数作为一个方法的参数(函数作为参数传递进方法中),下面通过例1来理解Lambda表达式的概念。

    例1

    先定义一个计算数值的接口,代码如下。

// 可计算接口
public interface Calculable {
    // 计算两个int数值
    int calculateInt(int a, int b);
}

    Calculable接口只有一个方法calculateInt,参数是两个int类型,返回值也是int类型。实现方法代码如下:

public class Test{
    /**
     * 通过操作符,进行计算
     *
     * @param opr 操作符
     * @return 实现Calculable接口对象
     */
    public static Calculable calculate(char opr) {
        Calculable result;
        if (opr == '+') {
            // 匿名内部类实现Calculable接口
            result = new Calculable() {
                // 实现加法运算
                @Override
                public int calculateInt(int a, int b) {
                    return a + b;
                }
            };
        } else {
            // 匿名内部类实现Calculable接口
            result = new Calculable() {
                // 实现减法运算
                @Override
                public int calculateInt(int a, int b) {
                    return a - b;
                }
            };
        }
        return result;
    }
}

    方法calculate中opr参数是运算符,返回值是实现Calculable接口对象。代码第13行和第23行都采用匿名内部类实现Calculable接口。代码第16行实现加法运算。代码第26行实现减法运算。

public static void main(String[] args) {
    int n1 = 10;
    int n2 = 5;
    // 实现加法计算Calculable对象
    Calculable f1 = calculate('+');
    // 实现减法计算Calculable对象
    Calculable f2 = calculate('-');
    // 调用calculateInt方法进行加法计算
    System.out.println(n1 + "+" + n2 + "=" + f1.calculateInt(n1, n2));
    // System.out.printf("%d + %d = %d \n", n1, n2, f1.calculateInt(n1, n2));
    // 调用calculateInt方法进行减法计算
    System.out.println(n1 + "-" + n2 + "=" + f1.calculateInt(n1, n2));
    // System.out.printf("%d - %d = %d \n", n1, n2, f2.calculateInt(n1, n2));
}

    代码第5行中f1是实现加法计算Calculable对象,代码第7行中f2是实现减法计算Calculable对象。代码第9行和第12行才进行方法调用。

    上述代码中列出了两种输出方式,下面简单介绍一下Java中常见的输出函数:

    1、printf主要继承了C语言中printf的一些特性,可以进行格式化输出。

    2、print就是一般的标准输出,但是不换行。

    3、 println和print基本没什么差别,就是最后会换行。

    输出结果如下:

10+5=15
10-5=15

    例1使用匿名内部类的方法calculate代码很臃肿,Java8采用Lambda表达式可以替代匿名内部类。修改之后的通用方法calculate代码如下:

/**
* 通过操作符,进行计算
* @param opr 操作符
* @return 实现Calculable接口对象
*/
public static Calculable calculate(char opr) {
    Calculable result;
    if (opr == '+') {
        // Lambda表达式实现Calculable接口
        result = (int a, int b) -> {
            return a + b;
        };
    } else {
        // Lambda表达式实现Calculable接口
        result = (int a, int b) -> {
            return a - b;
        };
    }
    return result;
}

    代码第10行和第15行用Lambda表达式替代匿名内部类,可见代码变得简洁。通过以上示例我们发现,Lambda表达式是一个匿名函数(方法)代码块,可以作为表达式、方法参数和方法返回值。

    Lambda表达式标准语法形式如下:

(参数列表) -> {
    // Lambda表达式体
}

    ->被称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分:

    左侧:Lambda表达式的参数列表。

    右侧:Lambda表达式中所需执行的功能,用{}包起来,即Lambda体。

    JavaLambda表达式的优缺点

    优点:

    1、代码简洁,开发迅速

    2、方便函数式编程

    3、非常容易进行并行计算

    4、Java引入Lambda,改善了集合操作(引入StreamAPI)

    缺点:

    1、代码可读性变差

    2、在非并行计算中,很多计算未必有传统的for性能要高

    3、不容易进行调试

    函数式接口

    Lambda表达式实现的接口不是普通的接口,而是函数式接口。如果一个接口中,有且只有一个抽象的方法(Object类中的方法不包括在内),那这个接口就可以被看做是函数式接口。这种接口只能有一个方法。如果接口中声明多个抽象方法,那么Lambda表达式会发生编译错误:

The target type of this expression must be a functional interface

    这说明该接口不是函数式接口,为了防止在函数式接口中声明多个抽象方法,Java8提供了一个声明函数式接口注解@FunctionalInterface,示例代码如下。

// 可计算接口
@FunctionalInterface
public interface Calculable {
    // 计算两个int数值
    int calculateInt(int a, int b);
}

    在接口之前使用@FunctionalInterface注解修饰,那么试图增加一个抽象方法时会发生编译错误。但可以添加默认方法和静态方法。

    @FunctionalInterface注解与@Override注解的作用类似。Java8中专门为函数式接口引入了一个新的注解@FunctionalInterface。该注解可用于一个接口的定义上,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。

    提示:Lambda表达式是一个匿名方法代码,Java中的方法必须声明在类或接口中,那么Lambda表达式所实现的匿名方法是在函数式接口中声明的。

    以上就是小编为大家准备的“Java Lambda表达式”一文,更多相关内容尽在开课吧广场Java教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营