什么是方法引用?
将已经存在的方法,拿过来,当做抽象方法的方法体
演变
匿名内部类 -> lambda表达式 -> 方法引用
方法引用的前提:
引用处:
必须是函数式接口
被引用的方法:
1. 被引用的方法已经存在
2. 被引用方法的形参与返回值,跟抽象方法一致
3. 被引用方法的功能可以满足当前需求
方法引用的分类
1. 引用静态方法
格式:类名::静态方法名
public static void main(String[] args) {
// 将:"1","2","3","4","5","6","7","8","9" 转换成 int 类型
List<String> list = new ArrayList<>();
Collections.addAll(list, "1", "2", "3", "4", "5", "6", "7", "8", "9");
list.stream().map(Integer::parseInt).forEach(s -> System.out.println(s));
}
2. 引用成员方法
格式:对象::成员方法名
- 引用 其他类的成员方法
格式:其他对象名::方法名
- 引用本类的成员方法
格式:this::方法名
- 引用父类的成员方法
super::方法名
- 其他调用方式
- 使用类名引用成员方法
格式:类名::成员方法名
规则:
抽象方法的第一个参数:表示引用哪个类的方法抽象方法的第二个参数到最后一个参数:要跟被引用方法的形参保持一致
// 将:“aaa”, “bbb”, “ccc” 转换成大写 public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "aaa", "bbb", "ccc"); // 方式1:使用匿名内部类 // list.stream().map(new Function<String, String>() { // @Override // public String apply(String s) { // return s.toUpperCase(); // } // }).forEach(System.out::println); // 方式2:使用方法引用 list.stream().map(String::toUpperCase).forEach(System.out::println); }
- 使用类名引用成员方法
-
引用数组的构造方法
格式:数据类型[]::new
// 将:1,2,3,4,5 收集到数组中
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5);
Integer[] array = list.stream().toArray(Integer[]::new);
System.out.println(Arrays.toString(array));
}
注:流中的数据类型要与数组的数据类型一致
3. 引用构造方法
格式:类名::new
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
public User(String str) {
this.name = str.split(",")[0];
this.age = Integer.parseInt(str.split(",")[1]);
}
}
// 将:"张无忌,15","张三丰,65","赵敏,30","周芷若,25","郭靖,20","黄蓉,28" 转换成 User 类型,并收集到 List<User> 中
public static void main(String[] args) {
// ArrayList<String> list = new ArrayList<>();
// Collections.addAll(list, "张无忌,15", "张三丰,65", "赵敏,30", "周芷若,25", "郭靖,20", "黄蓉,28");
// List<User> newList = list.stream().map((s) -> {
// User user = new User(s.split(",")[0], Integer.parseInt(s.split(",")[1]));
// return user;
// }).collect(Collectors.toList());
// System.out.println(newList);
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌,15", "张三丰,65", "赵敏,30", "周芷若,25", "郭靖,20", "黄蓉,28");
List<User> newList = list.stream().map(User::new).collect(Collectors.toList());
System.out.println(newList);
}