• 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

  • 相关阅读:
    用户、角色、权限管理-设计方案之权限检测
    供电绘图计算软件-新增了图库管理功能
    AutoCAD使用技巧六则
    环境影像评价系统
    AutoCAD.net: 如何实现裁剪功能Trim
    AutoCAD 命令参考手册
    arx常用的一些函数功能表
    AutoCAD.net: Curve.GetSplitCurves的用法
    AutoCAD.net:有条件选择AutoCAD实体
    电台节目管理软件
  • 原文地址:https://www.cnblogs.com/luckyplj/p/15776522.html
Copyright © 2020-2023  润新知