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

作者: 志哥666 | 来源:发表于2018-01-29 19:51 被阅读36次

    介绍

    什么是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中编译

    相关文章

      网友评论

        本文标题:五分钟,学会Java8的Lambda表达式

        本文链接:https://www.haomeiwen.com/subject/hcjfzxtx.html