jdk1.8新特性——方法引用构造器引用及数组引用详解

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdk1.8新特性——方法引用构造器引用及数组引用详解相关的知识,希望对你有一定的参考价值。

一、方法引用

1、方法引用的理解

  • 如果 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用。可以将方法引用理解为 Lambda 表达式的另外一种表现形式。

2、方法引用的基本语法

  • 对象的引用 :: 实例方法名
  • 类名 :: 静态方法名
  • 类名 :: 实例方法名

3、方法引用的注意事项

  • 方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
  • 如果Lambda 的参数列表的第一个参数,是实例方法的调用者,且Lambda 的参数列表的第二个参数(或无参)是实例方法的参数时,使用ClassName::MethodName格式。

二、方法引用的示例

1、方法引用语法 (对象的引用 :: 实例方法名

  • 示例代码如下:

    package com.xz.springboot_java8.day5;
    import java.io.PrintStream;
    import java.util.function.Consumer;
    /**
     * @description: 方法引用语法 (对象的引用 :: 实例方法名)
     * @author: xz
     */
    public class Test1 {
        public static void main(String[] args) {
            System.out.println("=========Lambda表达式写法如下=============");
            Consumer<String> con =(x)-> System.out.println(x);
            con.accept("Lambda表达式写法!");
    
            //优化方式一 对象的引用::实例方法名 的格式
            System.out.println("-------------方法引用写法如下--------------");
            PrintStream printStream=System.out;
            Consumer<String> con1 =printStream::println;
            con1.accept("方法引用写法(对象的引用::实例方法名)的语法格式");
    
            //优化方式二 对象的引用::实例方法名 的格式
            System.out.println("++++++++++++++++方法引用写法如下++++++++++++");
            Consumer<String> con2 =System.out::println;
            con2.accept("方法引用写法(对象的引用::实例方法名)的语法格式");
        }
    }
    
  • 输出结果如下:

  • 方法引用的注意事项:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。

2、方法引用语法 (类名 :: 静态方法名

  • 示例代码如下:

    package com.xz.springboot_java8.day5;
    import java.util.Comparator;
    /**
     * @description: 方法引用语法 (类名 :: 静态方法名)
     * @author: xz
     */
    public class Test2 {
        public static void main(String[] args) {
            System.out.println("=========Lambda表达式写法如下=============");
            Comparator<Integer> comparable=(x, y)->Integer.compare(x,y);
            int result=comparable.compare(20,8);
            System.out.println(result);
    
            //优化方式 类名::静态方法名 的格式
            System.out.println("-------------方法引用写法如下--------------");
            Comparator<Integer> comparable1=Integer::compare;
            int result1=comparable.compare(20,8);
            System.out.println(result1);
    
        }
    }
    
  • 输出结果如下:

  • 方法引用的注意事项:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。

3、方法引用语法 (类名 :: 实例方法名

  • 示例代码如下:

    package com.xz.springboot_java8.day5;
    import java.util.function.BiPredicate;
    /**
     * @description: 方法引用语法 (类名 :: 实例方法名)
     *               若Lambda 的参数列表的第一个参数,是实例方法的调用者,
     *               且Lambda 的参数列表的第二个参数(或无参)是实例方法的参数时,
     *               格式: ClassName::MethodName
     * @author: xz
     */
    public class Test3 {
        public static void main(String[] args) {
            System.out.println("=========Lambda表达式写法如下=============");
            BiPredicate<String, String> biPredicate=(x,y)->x.equals(y);
            boolean flag=biPredicate.test("xz","xz");
            System.out.println(flag);
    
            //优化方式 类名 :: 实例方法名 的格式
            System.out.println("-------------方法引用写法如下--------------");
            BiPredicate<String, String> biPredicate1=String::equals;
            boolean flag1=biPredicate.test("xz","xz");
            System.out.println(flag);
        }
    }
    
  • 输出结果如下:

  • 方法引用的注意事项1:方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致。


  • 方法引用的注意事项2:如果Lambda 的参数列表的第一个参数,是实例方法的调用者,且Lambda 的参数列表的第二个参数(或无参)是实例方法的参数时,使用ClassName::MethodName格式。

三、构造器引用

1、构造器引用的理解

  • 与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法。

2、构造器引用的基本语法(类名 :: new)

  • 类名 :: new

3、构造器引用的注意事项

  • 构造器的参数列表,需要与函数式接口中参数列表保持一致。

四、构造器引用的示例

  • 示例代码如下:

    package com.xz.springboot_java8.day5;
    import com.xz.springboot_java8.day5.entity.Employee;
    
    import java.util.function.BiFunction;
    import java.util.function.Function;
    
    /**
     * @description: 构造器引用  (类名 :: new)
     * @author: xz
     */
    public class Test4 {
        public static void main(String[] args) {
            System.out.println("=========Lambda表达式写法如下(构造器传1个参数)=============");
            Function<Integer,Employee> fun=(x)->new Employee(x);
            Employee emp=fun.apply(20);
            System.out.println(emp);
    
            System.out.println("-------------构造器引用写法如下(构造器传1个参数)--------------");
            Function<Integer,Employee> fun1=Employee::new;
            Employee emp1=fun1.apply(20);
            System.out.println(emp1);
    
            System.out.println("=========Lambda表达式写法如下(构造器传2个参数)=============");
            BiFunction<Integer,String, Employee> biFunction=(x,y)->new Employee(x,y);
            Employee emp2=biFunction.apply(1,"张三");
            System.out.println(emp2);
    
            System.out.println("-------------构造器引用写法如下(构造器传2个参数)--------------");
            BiFunction<Integer,String, Employee> biFunction1 = Employee::new;
            Employee emp3 = biFunction1.apply(1, "张三");
            System.out.println(emp3);
    
        }
    }
    
  • 输出结果如下:

  • 构造器引用的注意事项:构造器的参数列表,需要与函数式接口中参数列表保持一致。


五、数组引用

1、数组引用的基本语法(类型[] :: new

  • 类型[] :: new

2、数组引用的示例

  • 示例代码如下:

    package com.xz.springboot_java8.day5;
    import java.util.function.Function;
    /**
     * @description: 数组引用 (类型[] :: new)
     * @author: xz
     */
    public class Test5 {
        public static void main(String[] args) {
            System.out.println("=========Lambda表达式写法如下=============");
            Function<Integer, String[]> fun = (x) -> new String[x];
            String[] str = fun.apply(5);
            System.out.println(str.length);
    
            System.out.println("-------------构造器引用写法如下--------------");
            Function<Integer, String[]> fun1 = String[]:: new;
            String[] str1 = fun.apply(10);
            System.out.println(str1.length);
    
        }
    }
    
  • 输出结果如下:

以上是关于jdk1.8新特性——方法引用构造器引用及数组引用详解的主要内容,如果未能解决你的问题,请参考以下文章

jdk1.8新特性——主要内容

JDK1.8新特性之--方法引用

Java基础之方法引用(JDK1.8新特性)

jdk1.8新特性Lambda表达式方法引用

33JDK1.8新特性(Lambda表达式Stream流)

Java8(JDK1.8)新特性