Lambda 表达式

Lambda 表达式是实现 函数式接口 的一种方式,可以看做匿名内部类的简写形式:它没有名称,但它有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常列表。
函数式接口

Lambda 表达式分为三个部分:参数列表()、操作符->和函数体{}

  1. // () -> {}
  2. // 示例:
  3. (String str1, String str2) -> {
  4. System.out.println(str1);
  5. return str2;
  6. }
  7. // 可以省略参数类型
  8. (str1, str2) -> {
  9. System.out.println(str1);
  10. return str2;
  11. }
  12. // 只有一个参数时可省略参数列表的小括号
  13. str -> {
  14. System.out.println(str);
  15. return str;
  16. }
  17. // 函数体只有一条语句时可以省略函数体的大括号
  18. str -> System.out.println(str);
  19. // 函数体只有一条语句且为 return 语句时可省略 return 关键字
  20. str -> str
  21. // 当没有参数列表时使用小括号代替
  22. () -> System.out.println("No params");

方法引用

方法引用是进一步简化 Lambda 表达式的写法。
方法引用的格式:类型或者对象 :: 引用的方法
方法引用的四种形式:

  1. 静态方法的引用;
  2. 实例方法的引用;
  3. 特定类型方法的引用;
  4. 构造器引用;

    静态方法的引用

格式: 类名 :: 静态方法名

这里以 List Integer 转 String 为例:

  1. List<Integer> list = new ArrayList<>();
  2. // list.stream().map(s -> String.valueOf(s));
  3. List<String> strs = list.stream().map(String::valueOf).collect(Collectors.toList());

注意点:前后参数一致的静态方法。

实例方法的引用

格式:实例对象 :: 方法名

这里以 System.out 对象的实例方法 println(String x) 为例:

  1. List<String> list = new ArrayList<>();
  2. // lists.forEach(s -> System.out.println(s));
  3. list.forEach(System.out::println);

注意点:前后参数一致。

特定类型的方法引用

要点:参数列表中形参中的第一个参数作为了要调用方法的调用者,并且其余参数作为后面方法的实参,那么就可以用特定类型方法引用了。

  1. String[] strs = new String[]{"James", "AA", "John", "Patricia", "Dlei", "Robert", "Boom", "Cao", "black", "Michael", "Linda", "cao", "after", "sBBB"};
  2. // 按照元素的首字符(忽略大小写)升序排序
  3. Arrays.sort(strs, (s1, s2) -> s1.compareToIgnoreCase(s2));
  4. // 特定类型的方法引用
  5. Arrays.sort(strs, String::compareToIgnoreCase);

构造器引用

s -> new Student(s) => Student::new
创建对象时,前后参数一致。