• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于java:玩转java-Lambda表达式之构造方法引用

java 搞代码 4年前 (2022-02-14) 25次浏览 已收录 0个评论

什么是办法援用?

Lambda还有一个十分重要的性能,就是办法援用。办法援用能够了解为lambda表达式的简便写法。办法援用是用来间接拜访类或者实例的曾经存在的办法或构造方法(函数),它比lambda表达式更加的简洁,更高的可读性,更好的复用性。

办法援用的语法

类名(或实例)::办法名

办法援用的分类

办法援用类型 语法 Lambda表达式
静态方法援用 类名::staticMethod (args)->类名.staticMethod(args)
实例办法援用 instance::instMethod (args)->instance::instMethod(args)
对象办法援用 类名::instMethod (instance,args)->类名::instMethod(args)
<u>构造方法援用</u> <u>类名::new</u> <u>(args)->new 类名(args)</u>

构造方法援用的定义

函数式接口的实现能够通过调用一个类的构造方法来实现,就能够称之为构造方法援用。

构造方法援用的示例

废话少说,间接上干货,代码示例中都有重要正文

无输出参数,无返回值

构造方法援用,调用无参构造方法,因为实例对象无需返回,这个测试实际上没什么意义。

<code class="java">public class LambdaConstructorTest {

    /**
     * 无参数,无返回值
     */
    @Test
    public void test() {
        /**
         * Runnable函数式接口,无参无返回值,
         * 然而new Student() 仅仅创立一个对象,不作return解决
         */
        Runnable r1 = () -> new Student();
        // r1能够改写为构造方法援用,调用无参构造方法
        Runnable r2 = Student::new;
        r1.run();
        r2.run();
    }
}

class Student {
    private String name;
    private Integer age;

    public Student() {
        System.out.println("student defualt constructor");
    }

    public Student(String name) {
        System.out.println("student constructor param name:" + name);
        this.name = name;
    }

    public Student(String name, Integer age) {
        System.out.println("student constructor param name:" + name + ", age:" + age);
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
有参数,无返回值

构造方法援用,调用无参构造方法

Supplier<Student> s2 = Student::new;

<code class="java">public class LambdaConstructorTest {
    
   /**
     * 测试无参有返回值场景
     */
    @Test
    public void testNoArgReturnValue(){
        /**
         * java.util.function.Supplier java8自带的函数式接口
         * 返回一个student类对象
         */
        Supplier<Student> s1 = ()->new Student();
        // 将s1改写为构造方法援用,调用无参构造方法
        Supplier<Student> s2 = Student::new;

        //获取返回对象
        s1.get();
        s2.get();

    }
}

class Student {
    private String name;
    private Integer age;

    public Student() {
        System.out.println("student defualt constructor");
    }

    public Student(String name) {
        System.out.println("student constructor param nam<i style="color:transparent">来源gaodai$ma#com搞$$代**码网</i>e:" + name);
        this.name = name;
    }

    public Student(String name, Integer age) {
        System.out.println("student constructor param name:" + name + ", age:" + age);
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
有一个参数,有返回值

构造方法援用,调用带一个参数String name的构造方法

Function<String, Student> f2 = Student::new;

<code class="java">public class LambdaConstructorTest {   

   /**
     * 测试有一个参数,有返回值
     */
    @Test
    public void testArgsReturnValue(){
        /**
         * java.util.function.Function java8自带的函数式接口
         *
         * 返回值调用带有一个参数name的构造方法
         */
        Function<String, Student> f1 = name->new Student(name);

        // 将f1改为构造方法援用,调用带一个参数String name的构造方法
        Function<String, Student> f2 = Student::new;

        f1.apply("zhang san");
        f2.apply("li si");

    }
}

class Student {
    private String name;
    private Integer age;

    public Student() {
        System.out.println("student defualt constructor");
    }

    public Student(String name) {
        System.out.println("student constructor param name:" + name);
        this.name = name;
    }

    public Student(String name, Integer age) {
        System.out.println("student constructor param name:" + name + ", age:" + age);
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

若是有2个或更多参数的构造方法又如何实现构造方法援用呢?这个作业留给大家练习。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:玩转java-Lambda表达式之构造方法引用

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址