Java基础知识19方法引用(::)

1.概述

方法引用(Method Reference)是lambda表达式的一种特殊形式,如果正好有某个方法满足一个lambda表达式的形式,那就可以将这个lambda表达式用方法引用的方式表示,但是如果这个lambda表达式的比较复杂就不能用方法引用进行替换。实际上方法引用是lambda表达式的一种语法糖。

方法引用通过方法的名字来指向一个方法。方法引用可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号 :: 。

方法引用共分为四类:
1.类名::静态方法名
2.对象::实例方法名
3.类名::实例方法名 
4.类名::new

入门案例:

public class MethodReferenceTest {
    static void printStr(Consumer<String> c, String s) {
        // 借助Consumer接口,accept方法可以接收参数
        c.accept(s);
    }

    public static void main(String[] args) {
        printStr(s -> System.out.println(s), "Lambda写法");
        // 使用方法引用的前提:
        // |--对象已经存在(System.out)
        // |--方法也存在(println())
        // |--参数是方法可接收类型(String)
        printStr(System.out::println, "方法引用:连参数都不写");
    }
}

控制台输出:

Lambda写法
方法引用:连参数都不写

2.引用静态方法

Person实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private String age;

    public static int compareByAge(Person a,Person b){
        return a.age.compareTo(b.age);
    }
}

案例:

public class MethodReferenceTest {
    public static void main(String[] args) {
        Person[] persons = new Person[3];
        persons[0]=new Person("lucky","25");
        persons[1]=new Person("linda","21");
        persons[2]=new Person("peter","28");

        //使用匿名类
        Arrays.sort(persons, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge().compareTo(o2.getAge());
            }
        });

        //使用lambda表达式
        Arrays.sort(persons, (o1, o2) -> o1.getAge().compareTo(o2.getAge()));


        //使用lambda表达式和类的静态方法
        Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2));

        //使用方法引用
        //引用的是类的静态方法
        Arrays.sort(persons, Person::compareByAge);
        System.out.println(Arrays.toString(persons));
    }
}

控制台输出:

[Person(name=linda, age=21), Person(name=lucky, age=25), Person(name=peter, age=28)]

3.引用对象的实例方法

案例:

public class MethodReferenceTest {
    public static void main(String[] args) {
        Person[] persons = new Person[3];
        persons[0]=new Person("lucky","25");
        persons[1]=new Person("linda","21");
        persons[2]=new Person("peter","28");
        class ComparisonProvider{
            public int compareByName(Person a,Person b){
                return a.getName().compareTo(b.getName());
            }

            public int compareByAge(Person a,Person b){
                return a.getAge().compareTo(b.getAge());
            }
        }

        ComparisonProvider provider = new ComparisonProvider();

        //使用lambda表达式
        //对象的实例方法
        Arrays.sort(persons,(a,b)->provider.compareByAge(a,b));

        //使用方法引用
        //引用的是对象的实例方法
        Arrays.sort(persons, provider::compareByAge);
        System.out.println(Arrays.toString(persons));
    }
}

控制台输出:

[Person(name=linda, age=21), Person(name=lucky, age=25), Person(name=peter, age=28)]

4.引用类型对象的实例方法

案例:

public class MethodReferenceTest {
    public static void main(String[] args) {
        String[] stringsArray = {"Hello","World"};

        //使用lambda表达式和类型对象的实例方法
        Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));

        //使用方法引用
        //引用的是类型对象的实例方法
        Arrays.sort(stringsArray, String::compareToIgnoreCase);
        System.out.println(Arrays.toString(stringsArray));
    }
}

控制台输出:

[Hello, World]

参考文献:

https://www.cnblogs.com/JohnTsai/p/5806194.html----推荐

https://www.cnblogs.com/tigerlion/p/11182864.html

https://www.runoob.com/java/java8-method-references.html

https://blog.csdn.net/wsgytwsgyt/article/details/80273678

原文地址:https://www.cnblogs.com/luckyplj/p/15776522.html