Lambda表达式

来源:互联网 发布:淘宝的xbox手柄 编辑:程序博客网 时间:2024/06/08 14:38

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表达式转换成方法引用

原创粉丝点击