• Java8的Lambda表达式简介


      先阐述一下JSR(Java Specification Requests)规范,即Java语言的规范提案。是向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,可以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。可以理解为JSR是Java开发者以及授权者指定的标准,而Java开发者以及授权者形成一个JCP国际组织。职能是制定Java标准,即所有的规范都是有迹可循的。

      在Java8中推出的lambda表达式(参考JSR-335,地址为https://jcp.org/en/jsr/detail?id=335),官方的描述是:扩展Java语言以支持紧凑的lambda表达式(闭包),以及相关的语言和库功能,以使JavaSE的API能够使用lambda有效表达。通俗的理解为通过lambda表达式的本质是语法糖(Syntactic sugar,在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性),其底层还是通过编译器自动推断并生成匿名类来实现。可以使用更少的代码来实现同样的功能,使代码简洁的同时也使得Java支持闭包的功能。详见list.stream()和java.util.function包下提供了诸多的function接口。

      lambda表达式的语法:

         (parameters) -> expression 或

         (parameters) -> { statements; },

        即() -> {},等同于 new Interface(){}

      讲了一堆废话,贴代码吧:

    package com.mengyao.bigdata.lambda;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Map、List和class的lambda使用
     * lambda本质是 (parameters) -> expression; 或者 (parameters) -> { statements; }。即() -> {},等同于 new Interface(){}
     * @author mengyao
     *
     */
    public class Test1 {
    
        public static void main(String[] args) {
            // ==== 1 ==== Map的lambda示例,jdk8之前的写法就不贴出来了
            Map<String, Integer> map = new HashMap<String, Integer>() {{
                put("spark", 1);
                put("storm", 1);
                put("hadoop", 1);
                put("flink", 1);
            }};
            /**
             * parameters确定
             *         map.forEach参数为java.util.function.BiConsumer<? super String, ? super Integer> action,是一个接口的声明,
             *         实现采用的是for(Map.Entry<K, V> entry : entrySet())将entry的k和v作为参数传递到action.accept(k,v)中 验证,到此k,v参数已确定。
             * expression使用
             *         接下来是给到lambda的expression来使用
             * 所以如下3个map.forEach同理
             */
            map.forEach((k,v) -> System.out.println(k+":"+v));
            map.forEach((k,v) -> {System.out.println(k+":"+v);});
            map.forEach((k,v) -> {
                if (k.equals("spark")) {
                    System.out.println(k+":"+v);
                }
            });
            
            System.out.println("====");
            
            // ==== 2 ==== List的lambda示例
            List<String> list = new ArrayList<String>(10) {{
                add("spark");
                add("storm");
                add("hadoop");
                add("flink");
            }};
            // 与map.forEach同理
            list.forEach(System.out::println);//System.out是PrintStream的实例,::println即为调用System.out对象的println方法
            list.forEach(item -> System.out.println(item));
            list.forEach(item -> {System.out.println(item);});
            list.forEach(item -> {
                if (item.equals("spark")) {
                    System.out.println(item);
                }
            });
            
            //==== 3 ==== 自定义类的lambda使用
            // 接口类非lambda方式使用
            System.out.println("==== "+new MathService() {
                @Override
                public int plus(int a, int b) {
                    return a+b;
                }
            }.plus(1, 2));
            
            // 接口类lambda方式使用1(实现plus方法)
            MathService service = (a,b) -> a+b;
            System.out.println("==== "+service.plus(1, 2));
            // 接口类lambda方式使用2,将接口的实现作为参数
            print((a,b)->a+b);
            
        }
    
        /**
         * 使用接口作为参数,通常方法内部会调用接口的方法
         * @param service
         */
        static void print(MathService service) {
            int a =1,b=2;
            System.out.println(service.plus(a, b));
        }
        
    }
    interface MathService { //return a+b int plus(int a, int b); }

      补充一下,稍后会上传一些复杂用例。

  • 相关阅读:
    hive 之start hiveServer2 ,thriftServer失败
    sqoop 导入mysql中表存在联合主键
    hive metastore Server 出现异常
    hiveF 函数解析时间问题
    hive 动态分区数设置
    sqoop 操作从hdfs 导入到mysql中语句
    hive 锁表问题
    在hive中直接对timestamp类型取max报错
    Qt程序crash信息的捕捉与跟踪(转)
    功能快捷键如注释、声明和实现之间切换(转)
  • 原文地址:https://www.cnblogs.com/mengyao/p/10211980.html
Copyright © 2020-2023  润新知