Lambda 表达式
Lambda 表达式是实现 函数式接口 的一种方式,可以看做匿名内部类的简写形式:它没有名称,但它有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常列表。
函数式接口
Lambda 表达式分为三个部分:参数列表()、操作符->和函数体{}
// () -> {}
// 示例:
(String str1, String str2) -> {
System.out.println(str1);
return str2;
}
// 可以省略参数类型
(str1, str2) -> {
System.out.println(str1);
return str2;
}
// 只有一个参数时可省略参数列表的小括号
str -> {
System.out.println(str);
return str;
}
// 函数体只有一条语句时可以省略函数体的大括号
str -> System.out.println(str);
// 函数体只有一条语句且为 return 语句时可省略 return 关键字
str -> str
// 当没有参数列表时使用小括号代替
() -> System.out.println("No params");
方法引用
方法引用是进一步简化 Lambda 表达式的写法。
方法引用的格式:类型或者对象 :: 引用的方法
方法引用的四种形式:
格式: 类名 :: 静态方法名
这里以 List Integer 转 String 为例:
List<Integer> list = new ArrayList<>();
// list.stream().map(s -> String.valueOf(s));
List<String> strs = list.stream().map(String::valueOf).collect(Collectors.toList());
实例方法的引用
格式:实例对象 :: 方法名
这里以 System.out 对象的实例方法 println(String x) 为例:
List<String> list = new ArrayList<>();
// lists.forEach(s -> System.out.println(s));
list.forEach(System.out::println);
特定类型的方法引用
要点:参数列表中形参中的第一个参数作为了要调用方法的调用者,并且其余参数作为后面方法的实参,那么就可以用特定类型方法引用了。
String[] strs = new String[]{"James", "AA", "John", "Patricia", "Dlei", "Robert", "Boom", "Cao", "black", "Michael", "Linda", "cao", "after", "sBBB"};
// 按照元素的首字符(忽略大小写)升序排序
Arrays.sort(strs, (s1, s2) -> s1.compareToIgnoreCase(s2));
// 特定类型的方法引用
Arrays.sort(strs, String::compareToIgnoreCase);
构造器引用
s -> new Student(s) => Student::new
创建对象时,前后参数一致。