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;
    }
}

图片




相关文章
|
3月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
232 18
|
2月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
201 4
|
3月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
141 11
|
2月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
289 5
|
3月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
Java
JAVA方法的定义
JAVA方法的定义
225 0
|
9月前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
182 25
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
171 1
|
存储 Java
Java数组与带参数方法:定义、调用及实践
Java数组与带参数方法:定义、调用及实践
217 1