当前位置: 首页 > 图灵资讯 > 技术篇> 方法引用

方法引用

来源:图灵教育
时间:2023-08-18 10:17:12

1、引用方法是什么?

将现有的方法作为函数接口中抽象方法的方法体使用。

2、什么时候可以用方法引用?

①、引用处需要函数接口

②、可引用的函数必须满足以下条件:

a、引用的方法必须已经存在

b、引用方法的形参和返回值应与抽象方法保持一致

c、引用的方法需要满足当前的功能

测试代码如下所示:

import java.util.Arrays;import java.util.Comparator;public class Test {    public static void main(String[] args) {        Integer[] arr1 = new Integer[]{1, 3, 4, 7, 89, 45, 33, 11, 44, 66};        Integer[] arr2 = new Integer[]{1, 3, 4, 7, 89, 45, 33, 11, 44, 66};        Arrays.sort(arr1, new Comparator<Integer>() {            @Override            public int compare(Integer o1, Integer o2) {                return Integer.compare(o1, o2);            }        });        System.out.println(Arrays.toString(arr1);        ///使用方法引用数据排序        Arrays.sort(arr2,Test::myCompare);        System.out.println(Arrays.toString(arr1);    }    ///写一个可以引用的方法    public static int myCompare(Integer o1, Integer o2){        return Integer.compare(o1, o2);    }}
3、方法引用的分类(包括引用其他类别的成员方法、引用这类成员方法和引用父类成员方法)

①、引用静态方法

②、引用成员方法

③、引用结构方法

3.1、引用静态方法:

格式:类名::静态方法

需求:如果集合中有以下数字(“1”、“2”、“3”、“4”、“5”),则需要将其转换为int类型(提示:流中的数据类型需要转换,即map)

import java.util.ArrayList;import java.util.Collections;import java.util.function.Function;public class Question1 {    public static void main(String[] args) {        ArrayList<String> list = new ArrayList<>();        Collections.addAll(list, "1", "2", "3", "4", "5");        ///使用流修改数据类型        list.stream().map(new Function<String, Integer>() {            @Override            public Integer apply(String s) {                return Integer.parseInt(s);            }        }).forEach( n -> System.out.print(n + " ") );        System.out.println("\n------------------------------");        ////直接调用现成的方法        list.stream().map(Integer::parseInt).forEach(n -> System.out.print(n + " "));    }}

3.2、引用成员方法

引用普通成员函数:

///使用方法引用Arrays排序数据.sort(arr2,new Test()::myCompare);//创建对象,然后使用::调用System.out.println(Arrays.toString(arr1);

注:thiss不能用于静态方法::由于静态方法中没有this关键字,方法名称被引用到方法中。

3.3、引用结构方法

格式:类名::new

需求:集中存储:周芷若-男-20", "王二麻子-女-23", "赵敏-女-22", "王富贵-男-30", "张强-男-14", "张三丰-男-19", "张举-男-23", "张良-女-25", "王镪-男-21", "王强-男-21"请将这些数据放入Person集中(如果Person属性有姓名和年龄)。

///Person类public class Person {    private String name;    private int age;    public Person() {    }    ///需要重写此方法    Person(String str){        this.name = str.split("-")[0];        this.age = Integer.parseInt(str.split("-")[2]);    }    public Person(String name, int age) {        this.name = name;        this.age = age;    }    /**     * 获取     * @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 "Person{name = " + name + ", age = " + age + "}";    }}//测试import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.function.Function;import java.util.stream.Collectors;public class Question2 {    public static void main(String[] args) {        ArrayList<String> list = new ArrayList<>();        Collections.addAll(list, "周芷若-男-20", "王二麻子-女-23", "赵敏-女-22", "王富贵-男-30", "张强-男-14", "张三丰-男-19", "张举-男-23", "张良-女-25", "王镪-男-21", "王强-男-21");        final List<Person> collect1 = list.stream().map(new Function<String, Person>() {            @Override            public Person apply(String s) {                String name = s.split("-")[0];                int age = Integer.parseInt(s.split("-")[2]);                return new Person(name, age);            }        }).collect(Collectors.toList());        System.out.println(collect1);        ///引用结构方法,为了满足引用方法的条件,需要在类中添加结构方法        final List<Person> collect2 = list.stream().map(Person::new).collect(Collectors.toList());        System.out.println(collect2);    }}