• Java8新特性


    Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码【将代码像数据一样进行传递】。可以写出更加简洁、更加灵活的代码,作为一种跟紧凑的代码风格,是Java的语言表达能力得到提升。

    Lambda表达式语法

    Java8中引入了一个新的操作符“->”,称为箭头操作符或Lambda操作符。
    Lambda操作符将Lambda表达式拆分成两部分

    • 左侧:Lambda表达式的参数列表
    • 右侧:Lambda表达式中所需要执行的功能,既Lambda体

    PS:Java Lambda表达式的一个重要用法是简化某些匿名内部类,所以Lambda表达式的参数列表可以参考为匿名内部类实现接口的方法的参数,Lambda体可以参考为接口实现类的内容。

    语法格式一:无参数、无返回值

    public class TestLambda {
        public static void main(String[] args) {
            TestLambdaInterface testLambdaInterface = () -> System.out.println("Lambda Test");
            testLambdaInterface.testLambdaFunction();
        }
    }
    
    interface TestLambdaInterface {
        void testLambdaFunction();
    }
    

    语法格式二:有参数,无返回值

    public class TestLambda {
        public static void main(String[] args) {
            TestLambdaInterface testLambdaInterface = (x) -> System.out.println(x);
            testLambdaInterface.testLambdaFunction("Lambda Test");
        }
    }
    
    interface TestLambdaInterface {
        void testLambdaFunction(String str);
    }
    

    PS:

    • Lambda表达式的参数列表有多个参数时,用小括号括起来,逗号隔开
    • Lambda表达式的参数列表只有一个参数,小括号可以省略
    • Lambda表达式的参数列表数据类型可以省略不写,JVM编译器可以通过上下文推断出数据类型【即类型推断】;如果写了的话,就都需要写

    语法格式三:有参数,有返回值

    public class TestLambda {
        public static void main(String[] args) {
            TestLambdaInterface testLambdaInterface = (x, y) -> {
                if (x > y) {
                    return x;
                }
                return y;
            };
            System.out.println(testLambdaInterface.testLambdaFunction(333, 555));
        }
    }
    
    interface TestLambdaInterface {
        Integer testLambdaFunction(Integer x, Integer y);
    }
    

    PS:

    • Lambda体有多条语句时,需要用大括号括起来
    • Lambda体只有一条语句时,大括号和return都可以省略

    函数式接口

    只包含一个抽象方法的接口,称为函数式接口。
    可以使用@FunctionalInterface注解修饰,用来检查该接口是否是函数式接口。
    同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。

    测试代码

    • 新建一个函数式接口
    @FunctionalInterface
    interface TestLambdaInterface<T> {
        String testLambdaFunction(T t);
    }
    
    • 作为参数传递Lambda表达式
    public static void main(String[] args) {
        Demo demo01 = new Demo(3, "哈哈哈");
    
        System.out.println(operation(demo01, (x) -> x.getRemark()));
    }
    
    private static String operation(Demo demo, TestLambdaInterface<Demo> testLambdaInterface) {
        return testLambdaInterface.testLambdaFunction(demo);
    }
    
    class Demo{
        Integer num;
        String remark;
        ......
    }
    

    PS:

    • 为了将Lambda表达式作为参数传递,接收Lambda表达式的参数类型必须是与该Lambda表达式兼容的函数式接口的类型。
    • 若Lambda表达式抛出一个异常,那么该异常需要在目标接口的抽象方法上声明。
  • 相关阅读:
    twitter分享问题(三)——Required oauth_verifier parameter not provided
    旋转数组的最小数字
    关系型数据库基础之:简单的数据查询
    twitter分享问题(一)——MISSING_ARG_APIKEY
    extern "C"的理解
    从一个链接错误探究GCC的链接库顺序
    GAE 博客——B3log Solo 0.4.0 正式版发布了!
    不使用资源文件动态创建对话框的做法
    GAE 博客——B3log Solo 0.4.0 正式版发布了!
    CodeBlocks启动多个进程实例的做法
  • 原文地址:https://www.cnblogs.com/fx-blog/p/11743181.html
Copyright © 2020-2023  润新知