Java8 笔记
在Java 8之前,实现Runnable常用方式是编写一个匿名类
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
});
thread.start();
使用Lambda表达式,可以将上述代码简化为
Thread thread = new Thread(() -> System.out.println("hello"));
thread.start();
Lambda表达式解析
(parameters) -> expression
or
(parameters) -> { statements; }
由语法看到,Lambda表达式包含了三个部分:
- 参数列表
- 箭头 -> 把参数列表与Lambda主体分割开
- Lambda主体,只有一行代码的时候可以省略大括号和return关键字
比如以下Lambda表达式都是合法的
(String str) -> str.length()
(String str) -> { return str.length(); }
() -> System.out.println("hello")
() -> {}
() -> 17
(int x, int y) -> {
System.out.println(x);
System.out.println(y);
}
Lambda的使用场合
1、实现的对象是函数式接口的抽象方法
2、函数式接口的抽象方法的函数描述符和Lambda表达式的函数描述符一致
etc.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
run方法不接受参数,并且返回void,所以其函数描述符为() -> void
因此Runnable r = () -> System.out.println("hello")是合法的
更简洁的Lambda
编写一个类型转换的函数式接口
@FunctionalInterface
public interface TransForm<T, R> {
R transForm(T t);
}
编写一个Lambda表达式实现该函数式接口
TransForm<String, Integer> t = (String str) -> Integer.valueOf(str);
System.out.println(t.transForm("123"));
可以简化(Java编译器可以推断出适合Lambda的签名)
TransForm<String, Integer> t = Integer::valueOf;
System.out.println(t.transForm("123"));
这里使用了方法的引用,它的基本思想就是,如果一个Lambda表达式只是‘直接调用这个方法’,那么就用名称去描述它
s -> System.out.println(s);
System.out::println
Lambda表达式访问变量
Lambda表达式可以访问局部final变量,成员变量和静态变量
在Lambda表达式确保该表达式的值不会被改变