Lambda 表达式(4)

80 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

今天,想了一下,发现上次 Lambda 表达式还没有整理结束,上一篇关于 Lambda 表达式的内容,整理的基本上都是函数式接口的东西,因为过程中涉及到了函数式接口,之前也不太懂,所以就稍微延伸了一下。今天继续,Lambda 表达式......

方法引用

当要传递给 Lambda 表达式体的操作,已经有实现的方法了,就可以使用方法引用。实现抽象方法的参数列表,必须与方法引用的参数列表一致,方法的返回值也必须一致,即方法的签名一致。方法引用,可以理解为是 Lambda 表达式的另一种表现形式。

语法

使用操作符 "::" 将对象或类 与 方法名分隔开

场景

  • 对象::实例方法名
    /*
    printStream 中的 println 方法定义:
        public void println(String x) {
            synchronized(this) {
                print(x);
                newLine();
            }
        }
    */
    public void demo01() {
        PrintStream ps = System.out;
        Consumer<String> consumer = out::println;
        consumer.accept("Hello,World!");
    }
  • 类::静态方法名
    /*
    Integer 类中的静态方法 compare 的定义:
        public static int compare(int x, int y) {
            return (x < y) ? -1 : ((x == y) ? 0 : 1)
;        }
    */
    public void demo02() {
        Comparator<Integer> comparable = (x,y) -> Integer.compare(x,y);
         System.out.println(comparable.compare(5,3)); // 结果:1
         
        //使用方法引用实现上述 Lambda 表达式的效果
        Comparator<Integer> integerComparable = Integer::compare;
        System.out.println(integerComparable.compare(5,3)); //结果:1
    }
  • 类::实例方法名
    public void demo03() {
        BiPredicate<String,String> bp1 = (x,y) -> x.equals(y);
        System.out.println(bp1.test("5","3")); //结果:false
        
        //使用方法引用实现上述 Lambda 表达式的效果
        BiPredicate<String,String> bp2 = String::eqals;
        System.out.println(bp2.test("5","3")); //结果:false
    }

构造器引用

结合函数式接口,自动与函数式接口中方法兼容,可以把构造器引用赋值给定义的方法。注意:构造器参数列表要与接口中抽象方法的参数列表一致。

语法

类名::new

案例

创建一个学生实体类 Student

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        
        @Override
        public String toString() {
            return "Student{" + 
                   "id=" + id + 
                   ", name=" + name + '\'' + 
                   ", age=" + age + 
                   '}';
        }   
    }

构造器引用结合函数式接口

    public void demo04() {
        //无参构造
        Supplier<Student> supplier = Student::new;
        System.out.println(supplier.get());
        
        //有参构造
        Function<Integer, Student> function = Student::new;
        System.out.prnitln(function.apply(5));
        
        BiFunction<Integer, Integer, Student> biFunction = Student::new;
        System.out.println(biFunction.apply(10,22));
    }

结果:
    Student{id=null, name='null', age=null}
    Student{id=5, name='null', age=null}
    Student{id=10, name='null', age=22}

数组引用

语法

type[]::new

案例

    public void demo05() {
        Function<Integer, String[]> function = String[]::new;
        String[] strArr = function.apply(10);
        System.out.println(strArr.length); //结果:10
    }

整理了几种引用,类似 Lambda 表达式的另一种表达形式,使用起来也是能够大大简化代码的书写量......
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!