Lambda 表达式 in java 8

Lambda 表达式 in Java 8

  • Lambda表达式是java 8 新增的特性
  • Lambda表达式主要做用:支持将代码块做为方法参数,容许使用更简洁的代码建立函数式接口的实例,是匿名内部类的一种简化,能够部分取代匿名内部类的做用。
  • 函数式接口:只有一个抽象方法的接口。
  • Lambda表达式又称为匿名函数(anonymous function),表示一类无需定义标识符(函数名)的函数或者子程序,能够看作是一种语法糖

Lambda 表达式语法格式

Lambda表达式在java中由三部分组成:java

  • 形参列表:形参列表容许省略形参类型,若是形参列表只有一个参数,形参列表外的圆括号也能够省略
  • 箭头->:箭头不可省略
  • 代码块:若是代码块只有一条语句,容许省略代码块的花括号;更有甚者,只有一条return语句,能够省略return关键字。
interface Eatable{
    void taste();
}

interface Flyable{
    void fly(String weathrer);
}

interface Addable{
    int add(int a,int b);
}

public class LambdaTest {
    public void eat(Eatable e) {
        e.taste();
        System.out.println(e);
    }
    public void fly(Flyable f) {
        f.fly("好天气");
        System.out.println(f);
    }
    public void add(Addable a) {
        System.out.println(a.add(5, 3));
    }
    
    public static void main(String[] args) {
        LambdaTest test = new LambdaTest();
        test.eat(()->System.out.println("苹果"));
        test.fly(weater->{
            System.out.println("哈哈哈");
            System.out.println("能够飞行");
        });
        // 省略形参类型 省略花括号
        test.add((a,b)->a+b);
    }
}

函数式接口

  • 函数式接口是指只包含一个抽象方法的接口,(可有其余默认方法(default修饰)或者类方法)java 8 中有大量的函数式接口如最多见的:Runnable,ActionListener,并提供了@FunctionInterface注解,告诉编译器执行更严格的检查。
Runnbale r =()->{
    for(int i =0;i<100;i++){
        System.out.println(i);
    }
}; // 注意分号
  • Lamdba 表达式的目标类型只能是函数式接口。
  • Lambda 表达式常应用场景:
    1. 将Lambda表达式赋值给函数式接口类型的变量
    2. 做为函数接口类型的参数传给某个方法
    3. 使用函数式接口对Lambda表达式进行强制类型转换
Object obj = (Runnable)()->{
    System.out.println(...);
};

方法引用和构造器引用

  • 应用场景:代码块只有一条语句,而且该语句为调用方法或者构造器
  • 应用目的:使Lambda表达式的语法更为简洁
  • 应用方式:::
@FunctionalInterface
interface Converter{
    Integer convert(String from);
}

// 类方法
Converter con = from->Integer.valueOf(from);
Converter con1 = Integer::valueOf;

// 对象方法
Converter con2 = from->"hhhh".indexOf(from);
Converter con3 = "hhhh"::indexOf;

// 构造器相似
// ::new

Lambda表达式与匿名内部类的联系和区别

  • Lambda表达式简化了部分匿名内部类的写法(函数式接口),表现性质和匿名内部类一致,能够访问effective final局部变量,和外部类成员变量
  • 匿名内部类的应用范围更广,它能够为任何接口建立实例,也能够服务于抽象类和普通类
  • 注意Lambda表达式的代码块不容许调用接口中定义的默认方法
相关文章
相关标签/搜索