一、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());
        }

 

 

原文地址:http://www.cnblogs.com/yhstsy/p/16827166.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性