• 念念不忘,必有回响!包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 开源项目等
  • 念念不忘,必有回响!包含: 数据库原理, MySQL, ElasticSearch, MongoDB, Docker,CI&CD, Linux, DevOps, 分布式, 中间件等
  • 念念不忘,必有回响!包含: 开发工具, Git, IDE, 源码阅读,读书笔记等

方法和构造函数的便捷应用

2023-04-15 11:13
1690
0

在上面我们先加了印象片段 XX::xx,它也是Java8的新特性便捷式引用,这四个点可能你在其他语言里也见过。

IConverter<Integer, String> converter04 = String::valueOf;
String converted04 = converter04.convert(11);
System.out.println(converted04);
    @小傅哥: 代码已经复制到剪贴板

这四个点::的关键字,不只是可以引用方法和构造函数,还可以引用普通方法。

public class Something{
    public String startsWith(String s) {
        return String.valueOf(s.charAt(0));
    }
}
    @小傅哥: 代码已经复制到剪贴板

IConverter<String, String> converter01 = s -> String.valueOf(s.charAt(0)); //[参照物]直接把逻辑放到这调用
IConverter<String, String> converter02 = something::startsWith;            //引用的方法体里面逻辑可以更多,否则只是一句代码并不能适合所有的情况
System.out.println(converter01.convert("Java"));
System.out.println(converter02.convert("Java"));
 
        @小傅哥: 代码已经复制到剪贴板
  

接下来我们在使用这四个点,来看下如何引用类的构造器。首先我们创建一个这样的类;

public class Person {
    String firstName;
    String lastName;
Person() {}

Person(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}

}

    @小傅哥: 代码已经复制到剪贴板

然后我还需要顶一个工厂类,用于生成Person对象;

@FunctionalInterface
public interface IPersonFactory<P extends Person> {
P create(String firstName, String lastName);

}

    @小傅哥: 代码已经复制到剪贴板

现在就到了用四饼::的时候了;

IPersonFactory<Person> personFactory = Person::new;  //[参照物]:(firstName, lastName) -> new Person(firstName, lastName);
Person person = personFactory.create("Peter", "Parker");
    @小傅哥: 代码已经复制到剪贴板

提醒;工厂函数中依然只能有一个函数,否则会报错

四饼::,可以让我们直接引用到Person类的构造函数,然后 Java 编译器能够根据类的签名选中正确的构造器去实现 PersonFactory.create 方法。

全部评论