Lambda表达式是JAVA8的新特性
匿名类
new Thread( () -> System.out.print(“”));
listA.forEach( (a) -> System.out.print(a));
Predicate过滤
public static void main(args[]){
List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
System.out.println("Print language whose length greater than 4:");
filter(languages, (str)->str.length() > 4);
}
public static void filter(List names, Predicate condition) {
for(String name: names) {
if(condition.test(name)) {
System.out.println(name + " ");
}
}
}
Lambda VS Java匿名内部类
既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析。
1. 一个关键的不同点就是关键字 this。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向包围lambda表达式的类。
2. 另一个不同点是二者的编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。
3. lambda表达式内可以使用方法引用,仅当该方法不修改lambda表达式提供的参数。本例中的lambda表达式可以换为方法引用,因为这仅是一个参数相同的简单方法调用。
方法引用
方法引用使lambda表达式更简化
view.setOnClickListener(view -> {doSomething(view)})
// 使用方法引用
view.setOnClickListener(this::doSomething});
但要保证引用的方法和回调的参数一致
static methods | MyClass::doSomething |
---|---|
instance method of object | myObject::doSomething |
constructor | MyClass:: new |
instance method of any argument type | String::compare |
默认接口方法
当你往一个接口增加方法时,所有已经实现该接口的类就会变得编译不过,除非这些类能实现新增加的方法
默认接口方法提供的解决方案是,接口里可以定义一个默认的方法,在方法体里有它的默认实现
public interface MyView {
void showProgressbar();
// 关键字 default
default void hideProgressbar() {
// do something here
}
}
Android Studio自动转换Lambda表达式
使用快捷键 alt/option + enter ,将匿名类自动转换成Lambda表达式,或将Lambda表达式转换成方法引用