首页 > 其他分享 >lambda表达式

lambda表达式

时间:2022-10-26 09:33:07浏览次数:36  
标签:list 接口 Collections 表达式 o2 o1 lambda

一、lambda表达式是函数式编程思想

二、函数编程思想:

函数需要有输入和输出,“拿什么东西做什么事”,

尽量忽略对象的复杂用法——“强调做什么,而不是以什么实行做”,

总结——同样执行线程任务,使用函数编程思想,可以直接通过传递一段代码给线程对象执行,不需要创建任务对象。

总之,函数编程思想可以通过一段代码完成面向对象想要做的代码量

二、Lambda表达式的格式
1.标准格式:
(参数列表) -> {代码}

2.格式说明:
- 小括内的语法与传统方法参数列表一致,没有参数就留空,有多个参数就用逗号分隔

- 【->】 是新引入的语法格式,代表指向动作

- 大括号内的语法与传统方法体要求一致

3.案例说明
第一个线程案例

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run () {
                System.out.println("线程需要执行的任务代码1");
            }
        });
        thread1.start();
 
        // Lambda表达式
        Thread t2 = new Thread(()->{
            System.out.println("线程需要执行的任务代码2");
        });
        t2.start();

  第二个比较器案例

        List<Integer> list = new ArrayList<>();
        Collections.addAll(list,11,22,33,44,55);
        System.out.println("排序之前的集合:" + list);
        
        // 比较器的正常书写格式
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare (Integer o1, Integer o2) {
                return o2-o1;
            }
        });
 
        // Lambda表达式
        Collections.sort(list,(Integer o1, Integer o2)->{return o2-o1;});
        System.out.println("排序之后的集合:" + list);

三、表达式格式解析
Lambda表达式格式:()->{}

1.小括号中书写的内容和接口中的抽象方法的参数列表一致

2.大括号中书写的内容和实现接口中的抽象方法体一致

3.箭头是固定的

四、Lambda表达式的使用条件
首先,都是接口; 其次,接口中有且只有一个接口,才可以使用lambda表达式

1.接口中只有一个抽象方法的接口,叫做函数式接口

2.如果是函数式接口,那么就可以用@FunctionalInterface注解标识

 思考(扩展):

         Collections接口中有且只有一个抽象方法compareTo(),为什么Java底层没有给它@FunctionalInterface注解标识?

        因为:lambda表达式属于  锦上添花  的功能,每个类都有各自的功能或作用,而Comparable接口目前学习到的主要是为了给自定义类实现比较器方法的,@FunctionalInterface注解标识的作用主要是为了给编译器看,给编译器提供信息的,不管有没有这个注解,只要满足函数式的要求,那么它就是一个函数式接口

  Lambda表达式的省略格式:

                1.小括号中的形参类型可以省略

                2.如果小括号中只有一个参数的话,那么小括号可以省略

                3.如果大括号中只有一条语句,那么大括号、分号、return可以一起 省略

第1个案例:

      new Thread(()-> System.out.println("省略")).start();

第2个案例:

        public static void main (String[] args) {
      
        // 比较器案例
        ArrayList<Integer> list = new ArrayList<>();
            list.add(11);
            list.add(22);
            list.add(33);
            list.add(44);
            System.out.println("排序前:" + list);
 
            // 比较器常规写法
            Collections.sort(list, new Comparator<Integer>() {
                @Override
                public int compare (Integer o1, Integer o2) {
                    return o2 - o1;
                }
            });
 
            // Lambda表达式
            Collections.sort(list,(o1,o2)->o2-o1);
            System.out.println("排序后:" + list);
        }

六、表达式的表现形式

        1.变量的形式:变量的类型为函数式接口,就么可以复制一个Lambda表达式【不常用】

        // 变量的形式
        Runnable r = ()->{
            System.out.println("任务代码");
        };
        // 函数式接口类型的变量
        Thread t = new Thread(r);

 2.参数的形式:方法的形参类型为函数式接口,就可以传入一个Lambda表达式【常用】

        // 变量的形式-比较器
        Comparator<Integer> comparable = (o1, o2)->{return o2 - o1;};
        // 创建集合
        ArrayList<Integer> list = new ArrayList<>();
        // 存入数据
        Collections.addAll(list,11,22,33,44,55);
 
        // 将函数式接口类型  的 形参类型,传给Collections
        Collections.sort(list,comparable);

 3.返回值的形式:方法的返回值类型为函数式接口,就可以返回一个Lambda表达式【常用】

        // 定义一个方法
        public static Comparator<Integer> getComparator(){
            return (Integer o1,Integer o2)->{return  o2-o1;};
        }
        
        public static void main (String[] args) {
            // 返回值形式
            Collections.sort(list,getComparator());
        }

 

 

标签:list,接口,Collections,表达式,o2,o1,lambda
From: https://www.cnblogs.com/yhstsy/p/16827166.html

相关文章

  • 正则表达式(4)
    原理篇:回溯:https://zhuanlan.zhihu.com/p/274174421.贪婪量词“试”的策略是:买衣服砍价。价钱太高了,便宜点,不行,再便宜点。2.惰性量词“试”的策略是:卖东西加价。给少......
  • GROK 表达式
    GROK表达式常用表达式标识:USERNAME或USER正则:[a-zA-Z0-9._-]+名称:用户名描述:由数字、大小写及特殊字符(._-)组成的字符串例子:1234、Bob、Alex.Wong标识:EMAILLOCA......
  • C#中的委托delegate和Lambda表达式
    委托:委托别人去帮我完成某件事情。自定义委托AddDelegateAD=newAddDelegate(Add);//获取需要委托的方法详细,参数返回值和定义委托参数返回值都必须一样。stringst......
  • EL 表达式不生效,连同表达式一起显示在页面上
    EL表达式不生效,而是直接给我显示在页面上,在Eclipse上搞Web项目就没有这么多事情,我又习惯用Idea,再加上Tomcat版本是10.0。可能是这些原因,导致EL表达式默认不能......
  • 简单理解crontab表达式
    在日常工作中,我在使用定时任务的场景,一般使用Windows计划任务,或者hangfire这类的定时任务框架,因为hangfire已经实现了常用的cron表达式封装,所以一直也没去了解太多。趁着......
  • Javaweb基础复习------EL表达式+JSTL-if&foreach
    EL表达式------简化JSP页面的Java代码主要功能是------获取数据(语法:${data})举例://ServletDemo1.javapackagecom.example.servlet;importcom.example.pojo.User;i......
  • Chap06 回顾数据类型和表达式 第五组
    Chap06回顾数据类型和表达式1)数据存储方式:都是以二进制方式保存,最高位是符号位,0表示正数,1表示负数。 在计算机数据表达中提出了三个重要概念。原码反码补码  原......
  • Java8新特性-接口增强、Lambda表达式、函数式接口
    一、Interface接口增强1.1默认方法1.概念:使用default关键字来修饰的方法2.语法:访问修饰符default返回值类型方法名称(参数列表){方法体;return返回值}3.......
  • Python——正则表达式
    Python——正则表达式前戏'''案例:京东注册手机号校验基本需求:手机号必须是11位、手机号必须以1315开头、必须是纯数字'''phone=input('请输入您的手机号>>>:')......
  • 正则表达式
    正则表达式一、正则表达式正则表达式是一些特殊的符号组合在一起产生一些特殊含义,它能帮助我们方便的检查一个字符串中符合条件的数据值。正则表达式线上测试网址:http:......