java基础-方法引用

复制代码
package Day04;

import java.util.Arrays;
import java.util.Comparator;

public class methodReference1 {
    public static void main(String[] args) {
        //需求:创建一个数组,进行倒序排列
        Integer[] arr={3,5,4,1,6,2};
        //
        //1、匿名内部类
        Arrays.sort(arr,new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        for (Integer i : arr) {
            System.out.print(i+",");
        }
        //lamdba表达式
        //需求:创建一个数组,进行倒序排列
        Integer[] arr1={3,5,4,1,6,2};
        Arrays.sort(arr1,(Integer o1,Integer o2)->{return o2-o1;});
        System.out.println(Arrays.toString(arr1));
        //简写的lamdba表达式
        Integer[] arr2={3,5,4,1,6,2};
        Arrays.sort(arr2,(o1, o2)->o2-o1);
        System.out.println(Arrays.toString(arr2));

        //方法引用
        //条件:
        //1、引用处必须是函数式接口
        //2、被引用的方法必须已经存在,如果引用的方法不存在,就需要自己编写
        //3、被引用的形参和返回值需要和抽象方法的形参和返回值类型保持一致
        //4、被引用的方法的功能需要满足当前的要求
        Integer[] arr3={3,5,4,1,6,2};
        //引用的方式是类名::静态方法
        //注意看,这里是不要传参的,是把这个方法当作抽象方法的方法体
        Arrays.sort(arr3,methodReference1::getstraction);
        System.out.println(Arrays.toString(arr3));

    }
    public static int getstraction(int n1,int n2){
        return n2-n1;
    }
}

方法引用的分类:

1、引用静态方法

格式:类名::静态方法

示例:Integer::parseInt

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class methodReference2 {
    public static void main(String[] args) {
        //String 集合中有如下数字,把他们变为int类型
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"1","2","3","4","5");

        List<Integer> collect = list.stream().map(Integer::parseInt).collect(Collectors.toList());
        System.out.println(collect);

        //如果使用匿名内部类,对比看,可能会清楚一点
        list.stream()
                .map(new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.parseInt(s);
                    }
                });
    }
}

被引用的形参和返回值需要和抽象方法的形参和返回值类型保持一致

2、引用成员方法

格式:对象::成员方法

分三种情况:

(1)其他类:其他类的对象::方法名称

(2)本类:this::方法名称

复制代码
//需要特别注意:因为在static中没有this,所以在静态的main方法中是没有办法直接用this调用的
//你可以有两种方法:1、还是创建本类的对象,2、单独写一个非静态的方法,就可以用this::getstr了

(3)父类:super::方法名称

父类和本类其实是类似的

//需要特别注意:因为在static中没有this,所以在静态的main方法中是没有办法直接用this调用的 //你可以有两种方法:1、还是创建本类的对象,2、单独写一个非静态的方法,就可以用this::getstr了

所以,要注意,在本类或者父类中,你如果是用this或者是super引用方法,就说明这个时候这个方法是一个非静态的。那么就不能直接在psvm下面直接运行,你可以通过实现对象来获得最终效果。

3、引用构造方法

格式:类名::new

范例:Student::new

这里引用的构造方法一定要

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class methodReference4 {
    public static void main(String[] args) {
        //集合中存有姓名和年龄,比如:张无忌,15
        //将数据封装成student对象,并收集到List集合中

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌,15","周芷若,16","灭绝师太,30","张三丰,100");
        List<Student> collect = list.stream()
                //.map(s->new Student(s.split(",")[0],Integer.parseInt(s.split(",")[1])))
                .map(Student::new)
                .collect(Collectors.toList());
        System.out.println(collect);
    }
}
复制代码
package Day04;

public class Student {
    private String name;
    private int age;

    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student(String s) {
        this.name=s.split(",")[0];
        this.age=Integer.parseInt(s.split(",")[1]);
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

4、其他的方法引用

4.1:类名引用成员方法

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Collections;

public class methodReference5 {
    public static void main(String[] args) {
        //集合中有一些英文字母,变成大写再输出
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"a","b","c","d","e","f");
        list.stream()
                .map(String::toUpperCase)
                .forEach(s-> System.out.print(s));
    }
}

类名引用成员方法独有的:

1、需要有函数式接口

2、被引用的方法必须存在

3、被引用方法的形参需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致

4、被引用方法的功能需要满足当前的需求

4.2:引用数组的构造方法

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class methodReference6 {
    public static void main(String[] args) {
        //集合中存储一些整数,并收集到数组中

        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Integer[] array = list.stream()
                .toArray(Integer[]::new);
        for (Integer i : array) {
            System.out.print(i);
        }
    }
}

方法引用总结:

方法引用的小练习:

练习1:

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class methodReference7 {
    public static void main(String[] args) {
        //集合中存储一些字符串的数据,比如"张三,23",
        //收集到Students类型的数组中(方法引用)

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张三,23","李四,24","王五,25");
        //引用Students的构造方法
        Students[] array = list.stream()
                .map(Students::new)
                .toArray(Students[]::new);

        for (Students students : array) {
            System.out.println(
                    students.getName()+","+students.getAge()
            );
        }
    }
}

练习2:

复制代码
package Day04;

import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class methodReference8 {
    public static void main(String[] args) {
        //创建集合添加学生对象
        //学生对象属性:name,age
        //要求:获取姓名并且放在数组中(使用方法引用)
        ArrayList<Students> list=new ArrayList<>();
        Collections.addAll(list,new Students("张三",23),
                new Students("李四",24),
                new Students("王五",25));
        String[] array = list.stream()
                .map(Students::getName())
                .toArray(String[]::new);
        System.out.println(Arrays.toString(array));
    }
}

练习3:

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class methodReference9 {
    public static void main(String[] args) {
        //创建集合添加学生对象,学生的属性:姓名和年龄
        //把姓名和年龄拼接成字符串,比如张三-23,并放到数组当中

        ArrayList<Students> list=new ArrayList<>();
        Collections.addAll(list,new Students("张三一",23),
                new Students("李四二",24),
                new Students("王五三",25));
        String[] array = list.stream()
                .map(Students::toString)
                .toArray(String[]::new);
        System.out.println(Arrays.toString(array));
    }
}
相关推荐
爱编程的小吴2 小时前
【力扣练习题】热题100道【哈希】 最长连续序列
算法·leetcode·职场和发展
总是学不会.2 小时前
【JUC编程】一、线程的基础概念
java·开发语言·jvm
我是唐青枫2 小时前
C#.NET struct 全解析:什么时候该用值类型?
开发语言·c#·.net
由之2 小时前
Spring事件监听机制简单使用
java·spring
小鸡吃米…2 小时前
Python - 类属性
java·前端·python
沉下去,苦磨练!2 小时前
计算一个字符串在另一个字符串中出现次数
java·开发语言
froginwe112 小时前
Bootstrap5 表格
开发语言
Felven2 小时前
B. Lasers
算法
前端不太难2 小时前
Navigation State 驱动的页面调试方法论
开发语言·前端·react.js