Lambda表达式介绍

JDK1.8 中添加了 Lambda表达式,为 Java 添加了确实的函数式编程特性。

Lambda 表达式的类型是函数。但在 Java 中,Lambda 表达式是对像,他们必须依附于一类特别的对象类型——函数式接口。

Lambda 表达式最大的特点是:表示做什么,而非如何做。

函数式接口

举个例子:

定义一个接口,并添加 @FunctionalInterface 注解,声明其为一个函数式接口,该接口不接收参数并返回一个 String 类型的结果

@FunctionalInterface
public interface MyInterface {
    String test();
    default String getMe() {
        return "This is me";
    }
}

测试接口,打印 1 到 10 

public class MyTest {
    public String testMyInterface(MyInterface myInterface) {
        return "MyInterface accumulate result is: " + myInterface.test();
    }
    public static void main(String[] args) {
        MyTest myTest = new MyTest();
        String string = myTest.testMyInterface(() -> {
            String str = "";
            for (int i = 1; i < 10; i++) str += i + ",";
            return str;
        });
        System.out.println(string);
    }
}

关于函数式接口的声明有如下几个注意点

  • 一个函数式接口只有精确的一个抽象方法,静态方法与默认方法不计算在内
  • 如果在接口中声明了一个重写 java.lang.Object类 中的公有方法的抽象方法,那么该抽象方法不计入函数式接口的抽象方法中
    • 原因:接口总会直接或间接继承自 java.lang.Object类
  • 函数式接口的实例可以通过 lambda表达式、方法引用,或构造方法引用来创建
  • 当不满足下述条件时,编译器将报错
    • 类型是接口类型,而非注解、枚举或类
    • 被注解的接口需满足上述的函数式接口的要求
  • 如果某个接口只有一个抽象方法,但并没有给该接口声明 FunctionInterface 注解,编译器依旧会将该接口看作是函数式接口
  • 函数式接口的实现类的地址中会带上lambda

java.util.function 包中几个主要的接口

  • Function
    • 接收一个参数,并返回一个结果
    • 获取执行结果的方法:apply
  • Consumer
    • 接收一个参数,不返回结果
    • 调用方法:accept
  • Predicate
    • 接收一个参数,返回一个 boolean 类型的结果
    • 计算结果的方法:test
  • Supplier
    • 不接收任何参数,返回一个结果
    • 可作工厂用
    • 生产方法:get
  • java.util.function 中还提供了上述方法的各种变形
  • 还有,为了提高执行效率,还针对原生类型(int,double,long)提供了相应的接口

 

posted @ 2019-09-13 12:03  飞蛇在水  阅读(219)  评论(0编辑  收藏  举报