高级Java开发技术程序猿崛起Java 杂谈

五分钟,学会Java8的Lambda表达式

2018-01-29  本文已影响36人  志哥666

介绍

什么是lambda表达式?

Lambda表达式,说白了就是一个匿名函数。

lambda表达式的作用

让代码写起来,看起来都比较简洁。

01

java由于被设计为一个纯面向对象的语言,函数无法脱离类或者对象独立存在。如果实现把函数当做参数传递,那就不得不依赖Java的接口。看代码示例:
接口类:

public interface Operator {

    int operate(int a,int b);

}

调用类:

public class Main {
    public static void main(String[] args) {
        Operator operator = new Operator() {
            @Override
            public int operate(int a, int b) {
                return a+b;
            }
        };
        test(operator);
    }
    public static void test(Operator operator){
        int result = operator.operate(12,34);
        System.out.println(result);
    }
}

以上是大家熟悉的匿名内部类,当Java8可以支持lambda表达式之后就可以这么写了:

public class Main {
    public static void main(String[] args) {
        Operator operator = (a,b)->{return a+b;};
        test(operator);
    }
    public static void test(Operator operator){
        int result = operator.operate(12,34);
        System.out.println(result);
    }
}

这个lambda表达式其实就是对Operator接口operate方法的实现。Operator接口被叫做函数式接口。

看到这里,你肯定想说:

lambda表达式不就是将匿名内部类的写法简单化了嘛

确实如此。不过需要注意,如果Operator接口,有多个抽象方法,那就没法使用lambda表达式了。

函数式接口,有且只能有一个抽象方法。

02

有的时候,我们可能直接引用已存在的方法,为了支持方法的引用,Java8引入了::运算符。示例:

public class Main {
    public static void main(String[] args) {
        Operator operator = Main::add;
        test(operator);
    }
    public static void test(Operator operator){
        int result = operator.operate(12,34);
        System.out.println(result);
    }

    public static int add(int a,int b){
        return a+b;
    }
}

这段代码里,我们直接将Main的静态add方法赋值给了operator,看起来是不是有点像JavaScript的function赋值啊。
如果add方法是非静态的,只需要修改成如下就可以了:

Operator operator = new Main()::add;

虽然lambda表达式让让代码更简洁了,但也让面向对象变得没那么纯了,各有利弊吧。

注意:以上代码只能在Java8中编译

上一篇 下一篇

猜你喜欢

热点阅读