java方法引用

什么是方法引用?

将已经存在的方法,拿过来,当做抽象方法的方法体

演变

匿名内部类 -> 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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值