Jdk8新特性之方法引用

方法引用的格式

符号表示 : ::

符号说明 : 双冒号为方法引用运算符,而它所在的表达式被称为方法引用。
应用场景 : 如果Lambda所要实现的方案 , 已经有其他方法存在相同方案,那么则可以使用方法引用。
方法引用在JDK 8中使用方式相当灵活,有以下几种形式:

1. instanceName::methodName 对象::方法名
2. ClassName::staticMethodName 类名::静态方法
3. ClassName::methodName 类名::普通方法
4. ClassName::new 类名::new 调用的构造器
5. TypeName[]::new String[]::new 调用数组的构造器

对象名 ::引用成员方法
这是最常见的一种用法,与上例相同。如果一个类中已经存在了一个成员方法,则可以通过对象名引用成员方法,代码为:

// 对象::实例方法
    @Test
    public void test01() {
        Date d = new Date();
        Supplier<Long> getTime = d::getTime;
        Long time = getTime.get();
        System.out.println(time);
    }

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

类名 ::引用静态方法
由于在 java.lang.System 类中已经存在了静态方法 currentTimeMillis ,所以当我们需要通过Lambda来调用该
方法时,可以使用方法引用 , 写法是:

    // 类名::静态方法
    @Test
    public void test02() {
        //1585110320763
        Supplier<Long> timeMillis = System::currentTimeMillis;
        System.out.println(timeMillis.get());
    }

类名 ::引用实例方法
Java面向对象中,类名只能调用静态方法,类名引用实例方法是有前提的,实际上是拿第一个参数作为方法的调用者。

    // 类名::实例方法
    @Test
    public void test03() {
        //1
        Function<String, Integer> length = String::length;
        System.out.println(length.apply("hello"));   // 5

        Function<String, Integer> length1 = s1 -> {
            return s1.length();
        };

        //2
        BiFunction<String, Integer, String> substring = String::substring;
        String s = substring.apply("hello", 3);  //lo
        System.out.println(s);

        BiFunction<String, Integer, String> substr = (String s1, Integer i1) -> {
            return s1.substring(i1);
        };
        String hello = substr.apply("hello", 3);
        System.out.println(hello);
    }

类名 ::new引用构造器
由于构造器的名称与类名完全一样。所以构造器引用使用 类名称 ::new 的格式表示。首先是一个简单的 Person 类:

// 类名::new引用类的构造器
    @Test
    public void test04() {
        Supplier<Person> p1 = Person::new;
        Person person = p1.get();
        System.out.println(person);
        BiFunction<String, Integer, Person> p2 = Person::new;
        Person wgr = p2.apply("wgr", 27);
        System.out.println(wgr);
    }

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

 // 类型[]::new
    @Test
    public void test05() {
        Function<Integer, int[]> f1 = int[]::new;

        int[] arr1 = f1.apply(10);
        System.out.println(Arrays.toString(arr1));
    }

原文地址:https://www.cnblogs.com/dalianpai/p/12565517.html

时间: 2024-11-05 23:28:06

Jdk8新特性之方法引用的相关文章

JDK8新特性04 方法引用与构造器引用

import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; /** * 一.方法引用 * lambda方法体之 --> 方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用"方法引用" * (可以理解为方法引用是Lambda 表达式的另外一种表现形式) * * * 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实

Android 使用Java8新特性之&quot;方法引用&quot;

前言 上一文:Android 使用Java8新特性之Lambda expression (附命令者模式简化) 说过lambda表达式,在android studio中的环境配置及应用.本文讲下Java8新特性之"方法引用". "方法引用",它其实可以看成lambda表达式的一种简写形式. 再回顾一下lambda表达式的应用场景:简化仅含单一抽象方法接口的调用 方法引用的4种形式 方法引用的符号形式,形如, [className | class-instance]::

Java 8新特性-4 方法引用

对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMethodName 引用对象方法:  Object:: methodName 引用特定类型方法: ClassName :: methodName 引用构造方法: ClassName  :: new 静态方法引用示例 /** * 静态方法引用 * @param <P> 引用方法的参数类型 * @param

Java新特性05 方法引用

一. 定义 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法. 方法引用是Lambda表达式的一种简写形式: 如果Lambda表达式只是调用一个特定的已经存在的方法,则可以使用方法引用: 如果你觉得Lambda的方法体会很长,影响代码的可读性,则可以用方法引用来解决. 二. 语法 使用 :: 操作符将方法名与对象或类的名字分隔开. 三. 分类 (1)静态方法引用 ContainingClass::staticMethodName (2)实例方法引用 ContainingObject:

Java8 新特性3——方法引用与构造器引用

方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!)方法引用:使用操作符 "::" 将方法名和对象或类的名字分隔开来. 三种主要使用情况 : 对象::实例方法 类::静态方法 类::实例方法 //例如 (x) -> System.out.println(x); //等同于 System.out::println //例如 BinaryOperator<Double> bo =

JDK8新特性,方法的引用

引用方法并运行 在Java中,方法和构造方法都看作是对象的一种,那么你要引用它(不是调用),则可以用::来引用.用来存储这个引用的类型用@FunctionlaInterface注解来标识. 示例: package fun; /** * @author 施俊杰 * @email [email protected] */ public class TestMethods { @FunctionalInterface interface Fun<F1, F2, T> { T myrun(F1 fro

一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)

面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部结构 Linux 查询含有某字符串内容的命令grep 查询进程.GC状态.杀死进程 Hadoop五种节点介绍 -----------------------------------------------------------------------------------------------

JDK8 新特性

JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 重复注解和类型注解 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升. 如下示例,将一个匿名类转换为Lambda表达

C++新特性 右值引用 移动构造函数

1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision.RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝.下面简单地介绍一下Copy Elision.RVO,对此不感兴趣的可以直接跳过: (1) Copy Elision Copy Elision技术是为了防止某些不必要的临时对象产生和拷贝,例如: struct A { A(int)