根据我的观察,Lambda是一种比较灵活的形式,需要多看几个案例才能明白它。
Lambda是一种简化代码的技术手段,主要用于简化匿名实现类,允许把函数作为一个方法的参数传递进方法中。它本身并不会创造出新的概念和功能来。不过现在很多开源项目都使用到这种技术,我的原则是能看懂别人代码即可。

Lamdba 优点:
如果你的代码中有地方需要接口回调套接口回调,有可能套了好几层,虽然这种情况出现的概率比较低,但是一旦出现这种代码,lambda表达式的这个简洁,就很适合这种场景。

Lamdba 缺点:
缺点也是它的简洁,由于省略了太多东西,代码可读性有可能在一定程度上会降低,这个完全取决于你使用lambda表达式的位置所设计的API是否被你的代码的其他阅读者所熟悉。

使用语法:

(参数类型 参数名, 数参数类型 参数名2...) -> { 
// code
};

没有参数的案例

传统写法:

public static void general() {
    // 用匿名内部类的方式来创建线程
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Hello World.");
        }
    }).run();
}

Lambda 写法:

public static void lambda() {
    // 使用Lambda来创建线程
    new Thread(() -> System.out.println("Hello Lambda!")).run();
}

有参数,有返回值的案例

1个参数,一个返回值

public static void oneParam() {
    // Consumer<String> con = (s) -> System.out.println(s);

    // 参数的小括号可以省略。
    Consumer<String> con = s -> System.out.println(s);
    con.accept("oneParam Test!");
}

2个参数,一个返回值

interface Calculator {
    int calculate(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = (a, b) -> a + b;
        
        int result = calculator.calculate(5, 3);
        System.out.println(result);
    }
}

语法说明:

  • (a,b) 参数类型是可以省略的,编译器会根据上下文推断出参数类型。当然,这种省略并不是必须的,你也可以显式地指定参数类型;
  • a + b ,在Lambda表达式的主体中,如果主体只有一条表达式,那么这条表达式的结果将被隐式地作为Lambda表达式的返回值,并且这个大括号都是可以省略的。当然,你也可以使用了显式的return语句来返回结果。

和上面一样的代码,但是使用显示:

interface Calculator {
    int calculate(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = (int a, int b) -> {
            return a - b;
        };
        
        int result = calculator.calculate(5, 3);
        System.out.println(result);
    }
}

函数式接口@FunctionalInterface

TODO

09-28 16:11