博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解 lambda表达式 与 MethodReference(四)
阅读量:6418 次
发布时间:2019-06-23

本文共 11210 字,大约阅读时间需要 37 分钟。

package com.java.design.java8.MethodReference;import com.java.design.java8.entity.Student;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.util.Arrays;import java.util.List;import java.util.function.Supplier;/** * @author 陈杨 */@RunWith(SpringRunner.class)@SpringBootTestpublic class MethodReference {

一、测试数据准备

private List
students;private List
snames;private Student studentSupplier(Supplier
studentSupplier) { return studentSupplier.get();}// private StudentConstructor studentConstructor =// (id, name, sex, age, addr, salary) ->// new Student(id, name, sex, age, addr, salary);private StudentConstructor studentConstructor = Student::new;private Student studentAllArgs(Integer id, String name, String sex, Integer age, String addr, Double salary) { return studentConstructor.studentAllArgs(id, name, sex, age, addr, salary);}@Beforepublic void init() { Student kirito = new Student(1, "Kirito", "Male", 18, "Sword Art Online", 999999999.0); Student Asuna = new Student(2, "Asuna", "Female", 17, "Sword Art Online", 999999999.0); Student Sinon = new Student(3, "Sinon", "Female", 16, "Gun Gale Online", 999999999.0); Student Yuuki = new Student(4, "Yuuki", "Female", 15, "Alfheim Online", 999999999.0); Student Alice = new Student(5, "Alice", "Female", 14, "Alicization", 999999999.0); students = Arrays.asList(kirito, Asuna, Sinon, Yuuki, Alice); snames = Arrays.asList("kirito", "Asuna", "Sinon", "Yuuki", "Alice");}

二、方法引用 引入

@Testpublic void testMethodReference() {    //  MethodReference 方法引用    List
Iloveyou = Arrays.asList("Kirito", "Love", "Asuna"); //集合遍历 Lambda System.out.println("---------------------------------------\n"); System.out.println("集合遍历 Lambda"); Iloveyou.forEach(str -> System.out.println(str)); //集合遍历 MethodReference System.out.println("---------------------------------------\n"); System.out.println("集合遍历 MethodReference"); Iloveyou.forEach(System.out::println);

三、什么是方法引用

//  MethodReference//  方法引用是Lambda表达式的特殊替换//  方法引用本质是一个 函数指针 Function Pointer//  这个指针指向被引用方法//  eg: 方法引用System.out::println 指向System.out.println()这个函数

四、方法引用的分类

1、 静态方法引用

//   1、 静态方法引用//   静态方法引用 类名::静态方法名//   静态方法引用 功能实现等价于 调用 类的静态方法//   静态方法引用 与 调用  无任何关系//          类名.静态方法名   -->方法调用  显示传参//          类名::静态方法名  -->方法引用  隐式传参  编译器自动推断  方法引用的表达式 函数指针 指向 被引用函数System.out.println("---------------------------------------\n");System.out.println(" 静态方法引用 按年龄排序");students.sort(StaticStudentComparator::staticCompareStudentByAge);students.forEach(System.out::println);System.out.println("---------------------------------------\n");System.out.println(" 静态方法引用 按姓名排序");students.sort(StaticStudentComparator::staticCompareStudentByName);students.forEach(System.out::println);

2、 对象实例方法引用

//   2、 对象实例方法引用//   对象实例方法引用 引用名(对象名)::实例方法名//   对象实例方法引用 功能实现等价于 调用 对象实例 所拥有的 实例方法StudentComparator studentComparator = new StudentComparator();System.out.println("---------------------------------------\n");System.out.println(" 静态方法引用 按年龄排序");students.sort(studentComparator::compareStudentByAge);students.forEach(System.out::println);System.out.println("---------------------------------------\n");System.out.println(" 对象实例方法引用 按姓名排序");students.sort(studentComparator::compareStudentByName);students.forEach(System.out::println);

3、 类实例方法引用

//   3、 类实例方法引用//   类实例方法引用 类名::实例方法名System.out.println("---------------------------------------\n");System.out.println(" 类实例方法引用 按年龄排序");students.sort(Student::classCompareStudentByAge);students.forEach(System.out::println);System.out.println("---------------------------------------\n");System.out.println(" 类实例方法引用 按姓名排序");students.sort(Student::classCompareStudentByName);students.forEach(System.out::println);System.out.println("---------------------------------------\n");System.out.println(" 类实例方法引用 容易理解的 字符串排序");snames.sort(String::compareToIgnoreCase);snames.forEach(System.out::println);

4、 构造方法引用

//  4、  构造方法引用//  构造方法引用 类名::new//  注意: 实体类Student 事先 有定义好的 全参构造方法 与无参构造方法//        若没有构造方法 需要自行添加 否则报错//  Student::new 可以根据参数不同 对构造方法进行自动识别 重载//  利用无参构造方法构造studentNoArgs对象System.out.println("---------------------------------------\n");System.out.println("利用无参构造方法构造studentNoArgs对象");Student studentNoArgs = this.studentSupplier(Student::new);System.out.println(studentNoArgs);//  利用自定义全参构造方法构造student对象System.out.println("---------------------------------------\n");System.out.println("利用全参构造方法构造studentNoArgs对象");Student Silica = this.studentAllArgs        (6, "Silica", "Female", 10, "Sword Art Online", 999999999.0);System.out.println(Silica);    }}

五、StaticStudentComparator类 (静态方法实例引用)

import com.java.design.java8.entity.Student;import java.util.Comparator;public class StaticStudentComparator {    static Comparator
studentAgeComparator = (first, last) -> first.getAge() - last.getAge(); static Comparator
studentNameComparator = (first, last) -> first.getName().compareToIgnoreCase(last.getName()); public static int staticCompareStudentByAge(Student first, Student last) { return studentAgeComparator.compare(first, last); } public static int staticCompareStudentByName(Student first, Student last) { return studentNameComparator.compare(first, last); }}

六、StudentComparator类 (对象方法实例引用)

import com.java.design.java8.entity.Student;import java.util.Comparator;public class StudentComparator {    Comparator
studentAgeComparator = (first, last) -> first.getAge() - last.getAge(); Comparator
studentNameComparator = (first, last) -> first.getName().compareToIgnoreCase(last.getName()); public int compareStudentByAge(Student first, Student last) { return studentAgeComparator.compare(first, last); } public int compareStudentByName(Student first, Student last) { return studentNameComparator.compare(first, last); }}

七、StudentConstructor @FunctionalInterface接口 (构造方法实例引用)

import com.java.design.java8.entity.Student;@FunctionalInterfacepublic interface StudentConstructor {    Student studentAllArgs(Integer id, String name, String sex, Integer age, String addr, Double salary);}

八 、Student实体类 (类实例方法引用)

@Data@AllArgsConstructor@NoArgsConstructorpublic class Student {    private Integer id;    private String name;    private String sex;    private Integer age;    private String addr;    private Double salary;    public int classCompareStudentByAge(Student student) {        return this.getAge() - student.getAge();    }    public int classCompareStudentByName(Student student) {        return this.getName().compareToIgnoreCase(student.getName());    }}

九、 测试结果

.   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::        (v2.1.2.RELEASE)2019-02-02 17:04:20.851  INFO 16876 --- [           main] c.j.d.j.MethodReference.MethodReference  : Starting MethodReference on DESKTOP-87RMBG4 with PID 16876 (started by 46250 in E:\IdeaProjects\design)2019-02-02 17:04:20.852  INFO 16876 --- [           main] c.j.d.j.MethodReference.MethodReference  : No active profile set, falling back to default profiles: default2019-02-02 17:04:21.422  INFO 16876 --- [           main] c.j.d.j.MethodReference.MethodReference  : Started MethodReference in 0.878 seconds (JVM running for 1.682)---------------------------------------集合遍历 LambdaKiritoLoveAsuna---------------------------------------集合遍历 MethodReferenceKiritoLoveAsuna--------------------------------------- 静态方法引用 按年龄排序Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8)Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8)Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8)Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8)Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8)--------------------------------------- 静态方法引用 按姓名排序Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8)Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8)Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8)Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8)Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8)--------------------------------------- 静态方法引用 按年龄排序Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8)Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8)Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8)Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8)Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8)--------------------------------------- 对象实例方法引用 按姓名排序Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8)Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8)Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8)Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8)Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8)--------------------------------------- 类实例方法引用 按年龄排序Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8)Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8)Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8)Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8)Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8)--------------------------------------- 类实例方法引用 按姓名排序Student(id=5, name=Alice, sex=Female, age=14, addr=Alicization, salary=9.99999999E8)Student(id=2, name=Asuna, sex=Female, age=17, addr=Sword Art Online, salary=9.99999999E8)Student(id=1, name=Kirito, sex=Male, age=18, addr=Sword Art Online, salary=9.99999999E8)Student(id=3, name=Sinon, sex=Female, age=16, addr=Gun Gale Online, salary=9.99999999E8)Student(id=4, name=Yuuki, sex=Female, age=15, addr=Alfheim Online, salary=9.99999999E8)--------------------------------------- 类实例方法引用 容易理解的 字符串排序AliceAsunakiritoSinonYuuki---------------------------------------利用无参构造方法构造studentNoArgs对象Student(id=null, name=null, sex=null, age=null, addr=null, salary=null)---------------------------------------利用全参构造方法构造studentNoArgs对象Student(id=6, name=Silica, sex=Female, age=10, addr=Sword Art Online, salary=9.99999999E8)

转载地址:http://smpra.baihongyu.com/

你可能感兴趣的文章
lvm实现快速备份文件及数据库,lvm快照原理
查看>>
设计模式之Factory Method(工厂方法)
查看>>
10K入职linux运维岗位小伙伴感谢信及面试经历分享
查看>>
zookeeper入门之Curator的使用之几种监听器的使用
查看>>
[转]Reporting Service部署之访问权限
查看>>
innerxml and outerxml
查看>>
validform校验框架不显示错误提示
查看>>
flink 获取上传的Jar源码
查看>>
Spring Data JPA Batch Insertion
查看>>
UEditor自动调节宽度
查看>>
JAVA做验证码图片(转自CSDN)
查看>>
Delphi TServerSocket,TClientSocket实现传送文件代码
查看>>
JS无聊之作
查看>>
Mac上搭建ELK
查看>>
443 Chapter7.Planning for High Availability in the Enterprise
查看>>
框架和语言的作用
查看>>
unidac连接ORACLE免装客户端驱动
查看>>
Cygwin + OpenSSH FOR Windows的安装配置
查看>>
咏南中间件支持手机客户端
查看>>
fastscript增加三方控件之二
查看>>