• 方法引用与构造器引用(Method References)第三版


    • 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
    • 方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖
    • 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!
    • 格式:使用操作符 “::” 将类(或对象)与方法名分隔开来
    • 如下三种主要使用情况
    1. 对象  ::实例方法名
    2. 类     ::静态方法名
    3. 类     ::实例方法名  

    方法引用的使用场景

    • 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
    • 方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的实例

    方法引用使用的要求

    • 要求接口中的   抽象方法的形参列表和返回值类型   与   方法引用的方法的形参列表和返回值类型相同!

    1、对象::实例方法

    1.1、Consumer

    •  Consumer     中 的 void accept (T t)

    •  PrintStream  中 的 void println  (T t)

    1.2、Supplier

    • Supplier 中的  T  get()
    • Employee 中的 String getName()
    1. package com.methodreference;
    2. import org.junit.Test;
    3. import java.io.PrintStream;
    4. import java.util.function.Consumer;
    5. import java.util.function.Supplier;
    6. public class MethodRefTest {
    7. // 情况一:对象::实例方法
    8. // Consumer 中的 void accept(T t)
    9. // PrintStream 中的 void println(T t)
    10. @Test
    11. public void test1() {
    12. Consumer con1 = str -> System.out.println(str);
    13. con1.accept("方法的引用");//方法的引用
    14. System.out.println("=============");
    15. PrintStream ps = System.out;
    16. Consumer con2 = ps::println;
    17. con2.accept("方法的引用");//方法的引用
    18. Consumer con3 = System.out::println;
    19. con3.accept("方法的引用");//方法的引用
    20. }
    21. //Supplier中的 T get()
    22. //Employee中的 String getName()
    23. @Test
    24. public void test2() {
    25. Employee emp = new Employee(1001, "Tom", 23, 5600);
    26. Supplier sup1 = () -> emp.getName();
    27. System.out.println(sup1.get());//Tom
    28. System.out.println("=================");
    29. //方法引用
    30. Supplier sup2 = emp::getName;
    31. System.out.println(sup2.get());//Tom
    32. }
    33. class Employee {
    34. private Integer id;
    35. private String name;
    36. private Integer age;
    37. private Integer salary;
    38. public Employee() {
    39. }
    40. public Employee(Integer id, String name, Integer age, Integer salary) {
    41. this.id = id;
    42. this.name = name;
    43. this.age = age;
    44. this.salary = salary;
    45. }
    46. public Integer getId() {
    47. return id;
    48. }
    49. public void setId(Integer id) {
    50. this.id = id;
    51. }
    52. public String getName() {
    53. return name;
    54. }
    55. public void setName(String name) {
    56. this.name = name;
    57. }
    58. public Integer getSalary() {
    59. return salary;
    60. }
    61. public void setSalary(Integer salary) {
    62. this.salary = salary;
    63. }
    64. }
    65. }

    2、类::静态方法

    2.1、Comparator

    • Comparator 中的 int compare(T t1,T t2)
    • Integer 中 的int  compare(T t1,T t2)

    2.2、Function

    • Function 中的  R  apply(T  t)
    • Math 中的  Long round (Double d)
    1. //情况二:类::静态方法
    2. //Comparator中的int compare(T t1,T t2)
    3. //Integer中的int compare(T t1,T t2)
    4. @Test
    5. public void test3() {
    6. Comparator com1 = (t1, t2) -> Integer.compare(t1, t2);
    7. System.out.println(com1.compare(12, 21));//-1
    8. System.out.println("=============");
    9. Comparator com2 = Integer::compare;
    10. System.out.println(com2.compare(12, 21));//-1
    11. }
    12. //Function 中的 R apply(T t)
    13. //Math中的Long round(Double d)
    14. @Test
    15. public void test4() {
    16. Function func1 = d -> Math.round(d);
    17. System.out.println(func1.apply(23.23));//23
    18. System.out.println("==========");
    19. Function func2 = Math::round;
    20. System.out.println(func2.apply(-45.78));//-46
    21. }

    3、类::实体方法(有难度) 

    3.1、Comparator

    • Comparator 中的 int compare(T t1,T  t2
    • String  中的 int  t1.compareTo(t2)

    3.2、BiPredicate

    • BiPredicate 中的 boolean  test(T t1,T t2)
    • String 中的  boolean  t1.equals(t2)

    3.3、Function

    • Function  中的   R   apply(T  t)
    • Employee  中的  String  getName()
    1. //情况三:类::实例方法(有难度)
    2. //Comparator 中的 int compare(T t1,T t2)
    3. //String 中的 int t1.compareTo(t2)
    4. @Test
    5. public void test5() {
    6. Comparator com1 = (t1, t2) -> t1.compareTo(t2);
    7. System.out.println(com1.compare("23", "34"));//-1
    8. System.out.println("===============");
    9. Comparator com2 = String::compareTo;
    10. System.out.println(com2.compare("abd", "abm"));//-9
    11. }
    12. //BiPredicate 中的boolean test(T t1,T t2)
    13. //String 中的boolean t1.equals(t2)
    14. @Test
    15. public void test6() {
    16. BiPredicate pre1 = (s1, s2) -> s1.equals(s2);
    17. System.out.println(pre1.test("abc", "abc"));//true
    18. System.out.println("=====================");
    19. BiPredicate pre2 = String::equals;
    20. System.out.println(pre1.test("97", "a"));//false
    21. }
    22. //Function 中的 R apply(T t)
    23. //Employee 中的String getName()
    24. @Test
    25. public void test7() {
    26. Employee employee = new Employee(1001, "jerry", 23, 2900);
    27. Function func1 = e -> e.getName();
    28. System.out.println(func1.apply(employee));//jerry
    29. System.out.println("====================");
    30. Function func2 = Employee::getName;
    31. System.out.println(func2.apply(employee));//jerry
    32. }

    一、构造器引用

    • 和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。抽象方法的返回值类型即为构造器所属的类的类型。
    1. package com.methodreference;
    2. import org.junit.Test;
    3. import java.util.function.BiFunction;
    4. import java.util.function.Function;
    5. import java.util.function.Supplier;
    6. public class ConstructRefTest {
    7. class Employee {
    8. private Integer id;
    9. private String name;
    10. private Integer age;
    11. private Integer salary;
    12. public Employee() {
    13. System.out.println("方法的引用构造器引用");
    14. }
    15. public Employee(Integer id) {
    16. this.id = id;
    17. }
    18. public Employee(Integer id, String name) {
    19. this.id = id;
    20. this.name = name;
    21. }
    22. public Employee(Integer id, String name, Integer age, Integer salary) {
    23. this.id = id;
    24. this.name = name;
    25. this.age = age;
    26. this.salary = salary;
    27. }
    28. public Integer getId() {
    29. return id;
    30. }
    31. public void setId(Integer id) {
    32. this.id = id;
    33. }
    34. public String getName() {
    35. return name;
    36. }
    37. public void setName(String name) {
    38. this.name = name;
    39. }
    40. public Integer getAge() {
    41. return age;
    42. }
    43. public void setAge(Integer age) {
    44. this.age = age;
    45. }
    46. public Integer getSalary() {
    47. return salary;
    48. }
    49. public void setSalary(Integer salary) {
    50. this.salary = salary;
    51. }
    52. @Override
    53. public String toString() {
    54. return "Employee{" +
    55. "id=" + id +
    56. ", name='" + name + '\'' +
    57. ", age=" + age +
    58. ", salary=" + salary +
    59. '}';
    60. }
    61. }
    62. //构造器引用
    63. //Supplier 中的 T get()
    64. //Employee的空参构造器:Employee()
    65. @Test
    66. public void test1() {
    67. Supplier sup = new Supplier() {
    68. @Override
    69. public Employee get() {
    70. return new Employee();
    71. }
    72. };
    73. Supplier sup1 = () -> new Employee();
    74. System.out.println(sup1.get());//方法的引用构造器引用
    75. // Employee{id=null, name='null', age=null, salary=null}
    76. }
    77. //Function中的 R apply(T t)
    78. @Test
    79. public void test2() {
    80. Function func1 = id -> new Employee(id);
    81. System.out.println(func1.apply(100));//Employee{id=100, name='null', age=null, salary=null}
    82. Function func2 = Employee::new;
    83. System.out.println(func2.apply(200));//Employee{id=200, name='null', age=null, salary=null}
    84. }
    85. //BiFunction 中的 R apply(T t,U u)
    86. @Test
    87. public void test3() {
    88. BiFunction func1 = (id, name) -> new Employee(id, name);
    89. System.out.println(func1.apply(1222, "小明"));//Employee{id=1222, name='小明', age=null, salary=null}
    90. System.out.println("=============");
    91. BiFunction func2 = Employee::new;
    92. System.out.println(func2.apply(1000, "小兰"));//Employee{id=1000, name='小兰', age=null, salary=null}
    93. }
    94. }

     二、数组引用

    • 大家可以把数组看做是一个特殊的类,则写法与构造器引用一致。
    1. //数组引用
    2. //Function 中的 R apply(T t)
    3. @Test
    4. public void test4() {
    5. Function func1 = length -> new String[length];
    6. System.out.println(Arrays.toString(func1.apply(4)));//[null, null, null, null]
    7. System.out.println("================");
    8. Function func2 = String[]::new;
    9. System.out.println(Arrays.toString(func2.apply(4)));//[null, null, null, null]
    10. }

  • 相关阅读:
    Qt——多线程
    基于STM32CUBEMX驱动TOF模块VL53l0x(2)----修改设备地址
    ISO质量认证范围和审核范围的简要解说
    分享一个自用的Win11护眼主题(无需下载)
    Mac 错误zsh: command not found: brew解决方法
    Python实现飞翔的小鸟
    Swift宏
    房屋租赁管理系统
    12.3 实现模拟鼠标录制回放
    Flutter状态管理-FlyingRedux
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/132659314