(一)Lambda表达式 & @FunctionalInterface

1 简介

   作用:Lambda表达式就是属于简化代码,用于简化匿名实现类,提供一种更加简洁的写法。

   语法:

(type1 param1, type2 param2...) -> { 
    // 代码逻辑
};

需要注意的是:

 (1)参数类型可以省略;

 (2)当参数个数只有一个时可以省略掉小括号;

 (3)花括号{}中的内容就是方法中的方法体,当方法体中只有一行代码时可以省略{},当方法体中只有一行代码并且需要返回值时也可以省略掉return;

2 Demo

2.1 两个参数,一个返回值

public interface TestService {

  String sayHello(String name, Integer age);

  static void main(String[] args) throws Exception {
    TestService testService = (name, age) -> {
      System.out.println("name:"+name+",age:"+age);
      return "executor";
    };
    testService.sayHello("huaiheng",18);
  }
}

2.2 一个参数,一个返回值

public interface TestService {

  String sayHello(String name);

  static void main(String[] args) throws Exception {
    TestService testService = (name) -> {
      System.out.println("name:"+name);
      return "executor";
    };
    testService.sayHello("huaiheng");
  }
}

2.3  无参数,一个返回值

public interface TestService {

  String sayHello();

  static void main(String[] args) throws Exception {
    TestService testService = () -> {
      return "executor";
    };
    testService.sayHello();
  }
}

但是Lambda表达式的要求不是要求方法中仅一个方法而是仅有一个未实现接口,以集合排序示例进行说明:

// 使用匿名内部类 
static void main(String[] args) throws Exception {
    List<String> list = Arrays.asList("aa", "ff", "dd", "bb", "ee", "yy");
    Collections.sort(list, new Comparator<String>() {
      @Override
      public int compare(String s1, String s2) {
        return s2.compareTo(s1);
      }
    });
    System.out.println(list);
  }

// 使用lambda表达式
  static void main(String[] args) throws Exception {
    List<String> list = Arrays.asList("aa", "ff", "dd", "bb", "ee", "yy");
    Collections.sort(list, (s1, s2) -> ((String)s2).compareTo((String)s1));
    System.out.println(list);
  }

3 @FunctionalInterface

  从以上示例来看,Lambda其实是一种接口类型的数据类型,严格的说实际上是函数式接口,并且lambda表示的接口中只能有一个接口方法,可以有多个静态方法或者默认方法, 每一个该类型的lambda表达式都会被匹配到这个接口方法。

  对于注解@FunctionalInterface则专门是针对lambda表达式的,如果使用了该注解,编译器就会检查该接口中的接口方法是不是只有一个,如果有多个就会报错。

上一篇:Java函数式接口与Lambda表达式


下一篇:Java 8 特性-函数式接口详解