• day26 java lambda


    lambda

    lambda表达式 :对匿名内部类的对象的一种简写
    
    lambda表达式的格式 : (形参列表) -> {方法体}
    
    说明 :
        -> : lambda操作符

    例::Comparator

    原代码:

    1. Collections.sort(list, new Comparator() {
    2. @Override
    3. public int compare(Integer o1, Integer o2) {
    4. return 0;
    5. }
    6. });

    lambda可以写为:

    1. //lambda表达式(本质就是匿名内部类的对象 - 只不过是对匿名内部类的对象的一种简写)
    2. Comparator c2 = (Integer o1, Integer o2) -> {
    3. return 0;
    4. };
    5. Collections.sort(list,c2);

    进一步缩写

    * 当{Lambda体}中只有一句语句时,可以省略{}和{;}
    * 当{Lambda体}中只有一句语句时,并且这个语句还是一个return语句,
          那么{、return、;}三者可以省略。它们三要么一起省略,要么都不省略。
    * 当Lambda表达式(形参列表)的类型已知,获取根据泛型规则可以自动推断,
          那么(形参列表)的数据类型可以省略。
    * 当Lambda表达式(形参列表)的形参个数只有一个,并且类型已知或可以自动推断,
          则形参的数据类型和()可以一起省略,但是形参名不能省略。
    * 当Lambda表达式(形参列表)是空参时,()不能省略

    例1:

    1. Collections.sort(list,(Integer o1, Integer o2) -> {
    2. return 0;
    3. });
    4. //=====================
    5. Collections.sort(list,(Integer o1, Integer o2) -> 0);

    例2:

    1. Comparator c3 = new Comparator() {
    2. @Override
    3. public int compare(Integer o1, Integer o2) {
    4. return o1 - o2;
    5. }
    6. };
    7. //当Lambda表达式(形参列表)的类型已知,获取根据泛型规则可以自动推断,那么(形参列表)的数据类型可以省略。
    8. //lambda
    9. Comparator c4 = (o1,o2) -> o1 - o2;

    函数式接口:

    只有一个抽象方法的接口叫作函数式接口

    如果有和Object类中一样的方法的抽象方法也可以,因为所有类都是Object类中的子类,继承了其所有方法只用看其其他抽象方法就好。

    说明:

    1.lambda表达式只能是函数式接口

    2.函数式接口中只能一个抽象方法(如果有和Object类中一样的方法的抽象方法也可以)

    3.函数式接口中可以有默认方法和静态方法(也可以有常量)

    4.可以在接口上使用注解@FunctionalInterface判断接口是否为函数式接口

    例:下面的接口不能使用lambda表达式 因为不是一个函数式接口

    1. //@FunctionalInterface - 报错因为不是函数式接口
    2. interface MyInterface{
    3. void say(T t,T t2);
    4. void show(T t);
    5. }

    方法的引用对

    lambda表达式的进一步简化

    当Lambda表达式满足一些特殊的情况时,还可以再简化:
        (1)Lambda体只有一句语句,并且是通过调用一个对象的/类现有的方法来完成的
        (2)并且Lambda表达式的形参正好全部用上,Lambda体中没有额外的数据参与
    
    方法的引用的格式
         实例对象名::实例方法
         类名::静态方法
         类名::实例方法

    例1:类名::实例方法

    1. @Test
    2. public void test4(){
    3. //匿名对部类的对象
    4. new Comparator() {
    5. @Override
    6. public int compare(String o1, String o2) {
    7. //比较两个字串的内容
    8. /*
    9. public int compareTo(String anotherString) {
    10. }
    11. */
    12. return o1.compareTo(o2);
    13. }
    14. };
    15. //lambda表达式
    16. Comparator s = (o1,o2) -> o1.compareTo(o2);
    17. //方法的引用
    18. Comparator s2 = String::compareTo;

    例2:实例对象名::实例方法

    1. @Test
    2. public void test3(){
    3. //匿名内部类的对象
    4. new Consumer() {
    5. @Override
    6. public void accept(String s) {
    7. /*
    8. public void println(String x) {
    9. }
    10. */
    11. PrintStream ps = System.out;
    12. ps.println(s);
    13. }
    14. };
    15. //lambda表达式
    16. Consumer c = s -> System.out.println(s);
    17. //方法的引用
    18. Consumer c2 = System.out::println;

    类的引用和数组的引用

    1. public class LambdaTest2 {
    2. /*
    3. 类的引用:
    4. 类名::new
    5. */
    6. @Test
    7. public void test(){
    8. //匿名内部类的对象
    9. new Function() {
    10. @Override
    11. public Person apply(Integer integer) {
    12. //1.new的对象正好是抽象方法的返回值类型 2.抽象方法的形参正好是构造器要传的实参
    13. return new Person(integer);
    14. }
    15. };
    16. //lambda表达式
    17. Function f = i -> new Person(i);
    18. //类的引用
    19. Function f2 = Person::new;
    20. }
    21. /*
    22. 数组的引用:
    23. 数组的类型::new
    24. */
    25. @Test
    26. public void test2(){
    27. //匿名内部类的对象
    28. new Functionint[]>() {
    29. @Override
    30. public int[] apply(Integer integer) {
    31. //1.创建的数组正好是抽象方法的返回值类型 2.抽象方法的形参正好是数组的长度
    32. return new int[integer];
    33. }
    34. };
    35. //lambda表达式
    36. Functionint[]> f = i -> new int[i];
    37. //数组的引用
    38. Functionint[]> f2 = int[] :: new;
    39. }
    40. }
    41. class Person{
    42. public Person(int a){
    43. System.out.println("public Person(int a)");
    44. }
    45. }

  • 相关阅读:
    【云原生】DevOps 新纪元 | 史前的惨淡现实
    java基础
    18_eslint
    SPSS学习
    Qt实现最小化窗口到托盘图标
    seaborn学习1
    「曼孚科技」揭开计算机视觉的神秘面纱——物体检测技术
    什么?Coolbpf 不仅可以远程编译,还可以发现网络抖动!
    metaRTC p2p自建信令系统
    波函数:描述量子世界的数学工具
  • 原文地址:https://blog.csdn.net/oldzhongyi/article/details/138138930