java8新特性:方法引用与构造器引用

简介: java8新特性:方法引用与构造器引用

正文

方法引用的使用

1.使用情境:当要传递给Lambda体的操作,已有实现的方法了,可以使用方法引用!


2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的实例。


3.使用格式 类(或对象)::方法名


4.具体分为如下的三种情况:


对象 :: 非静态方法

类 :: 静态方法

类 :: 非静态方法

5.方法引用的使用要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型都相同(针对于情况一和情况二)

构造器引用

  • 和方法引用类似,函数式接口的抽象方法的形参和构造器的形参列表一致,抽象方法的返回值类型即为构造器所属的类的类型

数组引用

  • 大家可以把数组看成一个特殊的类,则写法与构造器引用一致

代码

MethodRefTest类

package com.day0328_1;
import org.junit.jupiter.api.Test;
import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
/**
 * 方法引用的使用
 *
 *  1.使用情境:当要传递给Lambda体的操作,已有实现的方法了,可以使用方法引用!
 *
 *  2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。所有
 *  方法引用,也是函数式接口的实例。
 *
 *  3.使用格式    类(或对象)::方法名
 *
 *  4.具体分为如下的三种情况:
 *  对象  :: 非静态方法
 *  类   :: 静态方法
 *
 *  类   :: 非静态方法
 *
 *  5.方法引用的使用要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的
 *  形参列表和返回值类型都相同(针对于情况一和情况二)
 *
 *
 */
public class MethodRefTest {
    //情境一:   对象::实例方法
    //Consumer中的void accept(T t)
    //PrintStream中的void println(T t)
    @Test
    public void test1(){
        Consumer<String> con1=str -> System.out.println(str);
        con1.accept("北京");
        System.out.println("****************");
        PrintStream ps=System.out;
        Consumer<String> con2=ps::println;
        con2.accept("beijing");
    }
    //Supplier中的T get()
    //Employee 中的String getName()
    @Test
    public void test2(){
        Employee emp= new Employee(1001,"Tom",23,5600);
        Supplier<String> sup1=()-> emp.getName();
        System.out.println(sup1.get());
        System.out.println("****************");
        Supplier<String> sup2=emp::getName;
        System.out.println(sup2.get());
    }
    //情况二: 类::静态方法
    //Comparator中的int compare(T t1,T t2)
    //Integer中的int compare(T t1,T t2)
    @Test
    public void test3(){
        Comparator<Integer> com1=(t1,t2)->Integer.compare(t1,t2);
        System.out.println(com1.compare(12,21));
        System.out.println("****************");
        Comparator<Integer> com2 = Integer::compare;
        System.out.println(com2.compare(12,3));
    }
    //Function中的R apply(T t)
    //Math中的Long round (Double d)
    @Test
    public void test4(){
        Function<Double,Long> func=new Function<Double, Long>() {
            @Override
            public Long apply(Double d) {
                return Math.round(d);
            }
        };
        System.out.println("****************");
        Function<Double,Long> func1=d->Math.round(d);
        System.out.println(func1.apply(12.3));
        System.out.println("****************");
        Function<Double,Long> func2=Math::round;
        System.out.println(func2.apply(12.6));
    }
    //情况三:类::实例方法(有难度)
    //Comparator中的int compare(T t1,T t2)
    //String 中的int t1.compareTo(t2)
    @Test
    public void test5(){
        Comparator<String> com1=(s1,s2)->s1.compareTo(s2);
        System.out.println(com1.compare("abc","abd"));
        System.out.println("****************");
        Comparator<String> com2=String::compareTo;
        System.out.println(com2.compare("abd","abm"));
    }
    //BiPredicate中的boolean test(T t1 ,T t2);
    //String 中的boolean t1.equals(t2)
    @Test
    public void test6(){
        BiPredicate<String,String> pre1=(s1,s2)->s1.equals(s2);
        System.out.println(pre1.test("abc","abc"));
        System.out.println("****************");
        BiPredicate<String,String> pre2=String::equals;
        System.out.println(pre2.test("abc","abd"));
    }
    //Function中的R apply(T t)
    //Employee中的String getName();
    @Test
    public void test7(){
        Employee employee=new Employee(1001,"Jerry",23,6000);
        Function<Employee,String> func1=e->e.getName();
        System.out.println(func1.apply(employee));
        System.out.println("****************");
        Function<Employee,String> func2=Employee::getName;
        System.out.println(func2.apply(employee));
    }
}

ConstructorRefTest类

package com.day0328_1;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
/**
 * 一、构造器引用
 *       和方法引用类似,函数式接口的抽象方法的形参和构造器的形参列表一致,
 *       抽象方法的返回值类型即为构造器所属的类的类型
 *
 * 二、数组引用
 *       大家可以把数组看成一个特殊的类,则写法与构造器引用一致
 *
 *
 */
public class ConstructorRefTest {
    //构造器引用
    //Supplier 中的 T get()
    @Test
    public void test1(){
        Supplier<Employee> sup=new Supplier<Employee>() {
            @Override
            public Employee get() {
                return new Employee();
            }
        };
        System.out.println("*************");
        System.out.println(sup.get());
        Supplier<Employee> sup1=()->new Employee();
        System.out.println(sup1.get());
        System.out.println("*************");
        Supplier<Employee> sup2=Employee::new;
        System.out.println(sup2.get());
    }
    //Function中的R apply(T t)
    @Test
    public void test2(){
        Function<Integer,Employee> func1=id->new Employee(id);
        Employee employee=func1.apply(1001);
        System.out.println(employee);
        System.out.println("*************");
        Function<Integer,Employee> func2=Employee::new;
        Employee employee1=func1.apply(1002);
        System.out.println(employee1);
    }
    //BiFunction中的R apply(T t,U u)
    @Test
    public void test3(){
        BiFunction<Integer,String,Employee>func1=(id,name)->new Employee(id,name);
        System.out.println(func1.apply(1001,"Tom"));
        System.out.println("*************");
        BiFunction<Integer,String,Employee>func2=Employee::new;
        System.out.println(func2.apply(1002,"Tom"));
    }
    //数组引用
    //Function中的R apply(T t)
    @Test
    public void test4(){
        Function<Integer,String[]> func1=length->new String[length];
        String[] arr1=func1.apply(5);
        System.out.println(Arrays.toString(arr1));
        Function<Integer,String[]> func2=String[]::new;
        String[] arr2=func1.apply(10);
        System.out.println(Arrays.toString(arr2));
    }
}

Employee 类

package com.day0328_1;
import java.util.Objects;
public class Employee {
    private int id;
    private String name;
    private int age;
    private double salary;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public Employee() {
        System.out.println("Employee()....");
    }
    public Employee(int id) {
        this.id = id;
        System.out.println("Employee(int id)....");
    }
    public Employee(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public Employee(int id, String name, int age, double salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return id == employee.id &&
                age == employee.age &&
                Double.compare(employee.salary, salary) == 0 &&
                Objects.equals(name, employee.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, name, age, salary);
    }
    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}

EmployeeData 类

package com.day0328_1;
import java.util.ArrayList;
import java.util.List;
/**
 * 提供测试的数据
 *
 */
public class EmployeeData {
    public static List<Employee> getEmployee(){
        List<Employee> list= new ArrayList<>();
        list.add(new Employee(1001,"马化腾",34,6000.38));
        list.add(new Employee(1002,"马云",12,9876.12));
        list.add(new Employee(1003,"刘强东",33,3000.82));
        list.add(new Employee(1004,"雷军",26,7657.37));
        list.add(new Employee(1005,"李彦宏",65,5555.32));
        list.add(new Employee(1006,"比尔盖茨",42,9500.53));
        list.add(new Employee(1007,"任正非",26,4333.32));
        list.add(new Employee(1008,"扎克伯格",35,2500.32));
        return list;
    }
}

图片




相关文章
|
22天前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
28天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
67 9
|
8天前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
17天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
34 6
|
21天前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
36 4
|
21天前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
24 4
|
19天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
24 1
|
Java
JAVA方法的定义
JAVA方法的定义
94 0
|
6月前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
43 1
|
7月前
|
存储 Java
Java数组与带参数方法:定义、调用及实践
Java数组与带参数方法:定义、调用及实践
79 1