JDK8新特性之方法引用

简介: 方法引用的几种常用方式应用场景:如果Lambda表达式所要实现的方案,已经有其他方法存在相同的方案,那么则可以使用方法引用.

符号表示: ::

符号说明:双冒号为方法引用运算符,而它所在的表达式被称为方法引用。

常用的引用方式:

1、instanceName::methodName 对象::方法名

2、ClassName::staticMethodName 类名::静态方法

3、ClassName::MethodName 类名::普通方法

4、ClassName::new 类名::new 调用的构造器

5、TypeName[]::new String[]::new 调用数组构造器

方法引用的注意事项

    1. 被引用的方法,参数要和接口中抽象方法的参数一样
    2. 当接口抽象方法有返回值时,被引用的方法也必须有返回值

目录

方法引用的几种常用方式

对象名::引用成员方法

类名::引用静态方法

类名::引用实例方法

类名::new 引用类构造器

数组::new 引用数组构造器

对象名::引用成员方法

    当一个类中已经存在成员方法,我们需要使用时,可以使用方法引用的方式.

//对象名引用成员方法 对象名::方法名

@Test
public  void testObject(){
    Date date = new Date();
    //使用Lambda表达式方式
    Supplier<Long> sup  = ()->{
        return  date.getTime();
    };
    System.out.println("时间 :"+sup.get());

    //使用方法引用 简写上述Lambda表达式
    Supplier<Long> supp = date::getTime;
    System.out.println("supp : "+supp.get());
}

类名::引用静态方法

    当某个类中已经存在我们需要使用的静态方法时,就可以直接使用方法引用的方式

//方法引用之类名调用静态方法 类名::静态方法

@Test
public void test2(){
    Supplier<Long> sup = System::currentTimeMillis;
    System.out.println("sup : "+sup.get());
}

类名::引用实例方法
java面向对象中,类名只能调用静态方法,而类名引用实例方法,需要使用第一个参数作为方法的调用者

//方法引用之实例方法引用  实际上是拿第一个参数作为方法的调用者  类名::方法名
@Test
public void test3(){
    Function<String,Integer> fun = (s)->{
        return s.length();
    };
    System.out.println("fun : "+fun.apply("hello"));
    //使用类名::方法名  进行方法引用操作
    Function<String,Integer> fun2 = String::length;
    System.out.println("fun2 : "+fun2.apply("dongdong"));
    BiFunction<String,Integer,String> bi = String::substring;
    System.out.println("bi :"+bi.apply("hello",2));
}

类名::new 引用类构造器
构造器名称和类名完全一致,所以调用构造器时使用 类名称::new 的格式。先造个类Person

public class Person {

private String name;
private Integer age;

public Person() {
}

public Person(String name) {
    this.name = name;
}

public Person(String name, Integer 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;
}

@Override
public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}

}
然后通过方法引用调用该类的构造器

//方法引用之构造方法引用  类名::new
@Test
public void test4(){
    Supplier<Person> sup = ()->{
       return new Person();
    };
    System.out.println("sup : "+sup.get());
    //方法引用调用构造器
    Supplier<Person> supp = Person::new;
    System.out.println("supp : "+supp.get());
    //方法引用调用带参构造器
    BiFunction<String,Integer,Person> bi = Person::new;
    System.out.println("bi : "+bi.apply("张三",18));
}

数组::new 引用数组构造器
数组也是Object的子类对象,所以同样具有构造器,只是语法不一样罢了。

//方法引用之数组构造方法引用  String[]::new 调用数组构造器  String[]可以是其他类型的构造器
@Test
public void test5(){
    Function<Integer,String[]> fun = (len)->{
        return new String[len];
    };
    System.out.println("fun : "+fun.apply(10));
    
    //方法引用  数组构造器 
    Function<Integer,String[]> fun2 = String[]::new;
    String[] arr = fun2.apply(10);
    System.out.println("arr :"+arr.length);
}

方法引用实际是对Lambda表达式复合特定情况下的一种缩写形式,使Lambda表达式更加简洁,但需要注意的是方法引用的方法是必须要存在的方法才行。

相关文章
|
1月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
55 7
|
3月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
35 1
|
4月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
53 3
|
3月前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
38 0
|
4月前
|
编解码 安全 Java
jdk8新特性-接口和日期处理
jdk8新特性-接口和日期处理
|
5月前
|
API
JDK8的stream有求和方法吗?
【8月更文挑战第20天】JDK8的stream有求和方法吗?
172 3
|
5月前
|
Java
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
|
5月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
5月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
4月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
21 0