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

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.*;

/**
 * 一、方法引用
 * lambda方法体之 --> 方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用"方法引用"
 * (可以理解为方法引用是Lambda 表达式的另外一种表现形式)
 *
 *
 * 主要有三种语法格式:
 *
 * 对象::实例方法名
 *
 * 类::静态方法名
 *
 * 类::实例方法名
 *
 * 注意:
 *  1)Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致!
 *  2) 若Lambda参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用 ClassName::method
 *      ClassName代表第一个参数的类型,也代表方法调用者的类型
 *      method的参数类型需要等同于第二个参数的类型
 *
 * 二、构造器引用
 *  格式:
 *  ClassName:new
 *      注意:需要调用的构造器参数列表要与函数式接口中抽象方法的参数列表保持一致
 *  三、数组引用
 *
 */

public class MethodRef {
    public static void main(String[] args) {
        test01();
        test02();
        test03();
        test04();
        test05();
        test06();
        test07();

    }
    /**
     * 对象::实例方法名
     */
    public static void test01() {
        PrintStream out = System.out;

        //1.lambda表达式  --> 方法的实现
        Consumer<String> con2 = (x) -> out.println(x);

        //2.lambda对象方法的引用  --> 方法的引用
        // 前提:引用的方法的参数列表和返回值类型 要与函数式接口的方法的 参数列表和返回值类型一致
        Consumer<String> con = System.out::println;
        con.accept("abcdef");
    }

    /**
     * 对象::实例方法名
     */
    public static void test02() {
        Employee emp = new Employee();
        Supplier<String> sup1 = () -> emp.getName(); //lambda方法体:对匿名类创建的写法的简化
        String name = sup1.get();
        System.out.println(name);

        System.out.println("---------------");
        Supplier<Integer> sup2 = emp::getAge;  //lambda之方法引用:对lambda方法体的引用
        Integer age = sup2.get();

        System.out.println(age);
    }

    //类::静态方法名
    public static void test03() {
        Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
        Comparator<Integer> com2 = Integer::compare;
    }

    /**
     * 类::实例方法名
     * 前提条件:
     * 若Lambda参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用 ClassName::method
     *      ClassName代表第一个参数的类型,也代表方法调用者的类型
     *      method的参数类型需要等同于第二个参数的类型
     */
    public static void test04() {
        BiPredicate<String,String> pre = (x,y) -> x.equals(y);
        BiPredicate<String,String> pre2 = String::equals;
    }

    /**
     * 构造器引用  无参数构造器
     */
    public static void test05() {
        Supplier<Employee> sup = () -> new Employee();
        Employee emp = sup.get();
        System.out.println(emp);

        System.out.println("----------");
        Supplier<Employee> sup2 = Employee::new;
        Employee emp2 = sup2.get();
        System.out.println(emp2);
    }

    /**
     * 构造器引用 有参数构造器,根据参数类型自动判断
     */
    public static void test06() {
        Function<Integer,Employee> fun = (x) -> new Employee(x);
        Employee emp = fun.apply(1);
        System.out.println(emp);

        System.out.println("----------");
        Function<Integer,Employee> fun2 = Employee::new;//泛型中参数类型是Integer
        Employee emp2 = fun2.apply(2);  //构造器一个参数,自动根据参数类别判断
        System.out.println(emp2);

        System.out.println("----------");
        Function<String,Employee> fun3 = Employee::new; //泛型中参数类型是String
        Employee emp3 = fun3.apply("hello world");//构造器一个参数,自动根据参数类别判断
        System.out.println(emp3);
    }

    /**
     * 数组引用
     */
    public static void test07() {
        Function<Integer,String[]> fun = (x) -> new String[x];
        String[] arr = fun.apply(10);
        System.out.println(arr);

        System.out.println("----------");
        Function<Integer,String[]> fun2 = String[]::new;//泛型中参数类型是Integer
        String[] arr2 = fun2.apply(20);  //构造器一个参数,自动根据参数类别判断
        System.out.println(arr2);
    }

}

原文地址:https://www.cnblogs.com/guchunchao/p/10310737.html

时间: 2024-08-19 02:39:55

JDK8新特性04 方法引用与构造器引用的相关文章

Jdk8新特性之方法引用

方法引用的格式 符号表示 : :: 符号说明 : 双冒号为方法引用运算符,而它所在的表达式被称为方法引用.应用场景 : 如果Lambda所要实现的方案 , 已经有其他方法存在相同方案,那么则可以使用方法引用.方法引用在JDK 8中使用方式相当灵活,有以下几种形式: 1. instanceName::methodName 对象::方法名2. ClassName::staticMethodName 类名::静态方法3. ClassName::methodName 类名::普通方法4. ClassNa

JDK8新特性,方法的引用

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

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

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

一次电话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++11新特性(1) 右值引用

在C++中,左值(lvalue)是可以获取其地址的一个量.由于经常出现在赋值语句的左边,因此称之为左值.例如一个有名称的变量. 例如: int a=10; //a就是一个左值. 传统的C++引用,都是左值引用.例如:int &ra=a;将ra关联到a.这就是左值引用. C++11,新增了右值引用的概念.用&&代表右值引用. 首先我们来看一下什么叫做右值.可以说所有不是左值的量都是右值.例如文本,临时对象或者临时值(都是不能获取地址的量). 右值引用,就是一个对右值的引用.特别地,这

java进阶一之jdk8新特性

1.官方发布的jdk8新特性 2.51CTO相关专题

java8中的方法引用与构造器引用

java8中的方法引用与构造器引用 方法引用:若Lambda体中的内容有方法已经实现了,我们可以使用"方法引用" 主要的三种语法格式: 对象::实例名 类::静态方法名 类::实例方法名 注意: Lmabda体中调用方法的参数列表与返回值类型要与函数式接口中抽象方法的函数列表和返回值类型保持一致 若Lambda参数列表中的第一参数是 实例方法的调用者,而第二个参数是 实例方法的参数时,可以使用ClassName::method public class Employee { priva

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

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