Java Lambda 学习

允许通过表达式来代替功能接口,
提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)

1、基本格式:

() -> {}

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
    statment1;
    statment2;
    ...
    return resultStatement;
}

2、简单示例:

// 不需要参数,返回值1
() -> 1
  
// 一个参数(数字类型),返回其2倍的值(当参数个数只有一个时,可以省略小括号)
x -> 2 * x
  
// 2个参数(数字),返回差值(参数类型省略,一般情况下,编译器会从上下文环境中推断出参数类型)
(x, y) -> x – y
  
// 2个int型整数,返回和值(当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号)
(int x, int y) -> x + y
  
// 一个 string类型的参数,在控制台打印,无返回值(返回void)
(String s) -> System.out.print(s)

3、Button点击事件举例:
使用前:

btnClick.setOnClickListener(new View.OnClickListener() {    
    @Override
    public void onClick(View v) {
        Toast.makeText(LambdaActivity.this, "吼吼吼", Toast.LENGTH_SHORT).show();
    }
});

使用后(alt+enter):

btnClick.setOnClickListener(v -> Toast.makeText(LambdaActivity.this, "吼吼吼", Toast.LENGTH_SHORT).show());

4、Thread实现Runnable举例:
使用前:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world !");
    }
}).start();

使用后:

new Thread(() -> System.out.println("Hello world !")).start();
或
new Thread(() -> {
    System.out.println("Hello world !");
}).start();

5、双冒号表达式:方法引用,直接通过方法名称引用已有方法。
举例:
使用前:

Observable.create(new Observable.OnSubscribe() {
    @Override
    public void call(Subscriber subscriber) {
        subscriber.onNext("Hello world !");
    }
}).subscribe(new Action1() {
    @Override
    public void call(String s) {
        System.out.println(s);
    }
});

使用后:

Observable.create((Observable.OnSubscribe) subscriber -> subscriber.onNext("Hello world !"))
.subscribe(System.out::print);

6、方法引用分类:

静态方法引用:ClassName::methodName
实例上的实例方法引用:instanceReference::methodName
超类上的实例方法引用:super::methodName
类型上的实例方法引用:ClassName::methodName
构造方法引用:Class::new
数组构造方法引用:TypeName[]::new

你可能感兴趣的:(Java Lambda 学习)