java中方法的引用

文章详细介绍了Java中方法引用的规则,包括类的静态方法引用、对象的实例方法引用,以及引用构造方法和数组构造方法的方式。此外,还提到了如何在StreamAPI中使用方法引用优化代码。
摘要由CSDN通过智能技术生成
  1. 方法引用的规则:
    1. 需要有函数式接口
    2. 被引用的方法必须已经存在
    3. 被引用的方法的形参和返回值,需要跟抽象方法形参和返回值保持一致
    4. 被引用方法的功能需要满足当前的需求
  2. 引用类的方法:引用类的静态方法
    1. 格式:类名:静态方法
    2. 范例:Integer::parseInt
      public static void main(String[] args) {
              //引用类方法,其实就是引用类的静态方法
      
              ArrayList<String> list = new ArrayList<>();
              Collections.addAll(list, "1","5","4","3","2");
      
              //把他们变成int类型
              /*list.stream().map(new Function<String, Integer>() {
                  @Override
                  public Integer apply(String s) {
                      int i = Integer.parseInt(s);
                      return i;
                  }
              }).forEach(s -> System.out.println(s));*/
      
      
              //类名::静态方法
              list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));
      
      
          }
  3. 引用对象的实例方法

    1. 格式:对象::成员方法

    2. 例:

       public static void main(String[] args) {
              //把字符串变成大写的数据,然后再控制台输出
              ArrayList<String> list = new ArrayList<>();
              Collections.addAll(list,"张无忌","赵敏","周芷若","张强","张三丰");
      
              /*list.stream().filter(new Predicate<String>() {
                  @Override
                  public boolean test(String s) {
                      return s.startsWith("张") && s.length() == 3;
                  }
              }).forEach(s-> System.out.println(s));*/
      
              /*list.stream().filter(s -> s.startsWith("张")&& s.length() == 3).forEach(s -> System.out.println(s));
      
      
              list.stream().filter(new PrintString()::printOperation).forEach(s -> System.out.println(s));*/
      
              //静态方法中没有this关键字,只能创建本类对象然后用对象调用本类静态方法
              list.stream().filter(new FunctionDemo2()::printOperation).forEach(s -> System.out.println(s));
      
          }
          public boolean printOperation(String s){
              return s.startsWith("张")&& s.length() == 3;
          }
      public class PrintString {
          public void printUpper(String s){
              String result = s.toUpperCase();
              System.out.println(result);
          }
      
          public boolean printOperation(String s){
              return s.startsWith("张")&& s.length() == 3;
          }
      }
  4. 引用成员方法

    1. 引用其他类的成员方法

      1. 对象::成员方法

    2. 引用本类的成员方法

      1. this::成员方法(静态方法中没有this关键字,先创建本类对象再引用方法)

    3. 引用父类的成员方法

      1. super::成员方法(静态方法中没有super关键字,先创建本类对象再引用方法)

  5. 引用构造方法

    1. public class Student {
          private String name;
          private int age;
      //该有的空参和全参构造get和set方法
      
          public Student(String str) {
              String[] arr = str.split(",");
              this.name = arr[0];
              this.age = Integer.parseInt(arr[1]);
          }
      
         
      }
      
       public static void main(String[] args) {
              //引用构造方法
              ArrayList<String> list = new ArrayList<>();
              list.add("zhangsan,23");
              list.add("lisi,24");
              list.add("wangwu,25");
      
              //不引用构造方法
              List<Student> list1 = list.stream().map(new Function<String, Student>() {
                  @Override
                  public Student apply(String s) {
                      String[] arr = s.split(",");
                      String name = arr[0];
                      int age = Integer.parseInt(arr[1]);
                      return new Student(name, age);
                  }
              }).collect(Collectors.toList());
              System.out.println(list1);
      
              //引用构造方法
              List<Student> list2 = list.stream().map(Student::new).collect(Collectors.toList());
              System.out.println(list2);
          }
  6. 其他调用方法

    1. 使用类名引用成员方法

      1.  public static void main(String[] args) {
                //使用类名引用成员方法
                //抽象方法形参详解
                /*
                * 第一个参数:表示被引用的方法的调用者,决定了可以引用哪些类中的方法
                * 在Stream流当中,第一个参数一般表示流里面的每一个数据。
                * 鸡舍流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法
                *
                * 第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明别引用的方法需要是无参的成员方法
                * */
                ArrayList<String> list = new ArrayList<>();
                Collections.addAll(list,"aaa","bbb","ccc");
        
                /*list.stream().map(new Function<String, String>() {
                    @Override
                    public String apply(String s) {
                        return s.toUpperCase();
                    }
                }).forEach(s -> System.out.println(s));*/
                list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));
        
        
            }
    2. 引用数组的构造方法

      1. 格式:数据类型[]::new

      2. 范例:int[] ::new

      3. 练习:集合中存储一些整数,收集到数组当中

      4.  public static void main(String[] args) {
                //将集合里面的数据收集到数组当中
        
                ArrayList<Integer> list = new ArrayList<>();
                Collections.addAll(list,1,2,3,4);
        
                Integer[] array = list.stream().toArray(Integer[]::new);
                //收集到集合当中
                /*Integer[] array = list.stream().toArray(new IntFunction<Integer[]>() {
                    @Override
                    public Integer[] apply(int value) {
                        return new Integer[value];
                    }
                });*/
                System.out.println(Arrays.toString(array));
        
        
            }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值