• Java 8 Lambda 表达式


    Java 8 Lambda 表达式
    语法
    lambda 表达式的语法格式如下:

    (parameters) -> expression
    或
    (parameters) ->{ statements; }
    

    Lambda 表达式实例

    public class Calculator {
    
        interface IntegerMath {
            int operation(int a, int b);
        }
    
        public int operateBinary(int a, int b, IntegerMath op) {
            return op.operation(a, b);
        }
    
        public static void main(String... args) {
            Calculator myApp = new Calculator();
            IntegerMath addition = (a, b) -> a + b;
            IntegerMath subtraction = (a, b) -> a - b;
            System.out.println("40 + 2 = " + myApp.operateBinary(40, 2, addition));
            System.out.println("20 - 10 = " + myApp.operateBinary(20, 10, subtraction));
        }
    }
    

    点击查看结果

    ``` 40 + 2 = 42 20 - 10 = 10 ```
    public class Java8Lambda {
        public static void main(String args[]) {
            Java8Lambda tester = new Java8Lambda();
    
            // 类型声明
            MathOperation addition = (int a, int b) -> a + b;
    
            // 不用类型声明
            MathOperation subtraction = (a, b) -> a - b;
    
            // 大括号中的返回语句
            MathOperation multiplication = (int a, int b) -> {
                return a * b;
            };
    
            // 没有大括号及返回语句
            MathOperation division = (int a, int b) -> a / b;
    
            System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
            System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
            System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
            System.out.println("10 / 5 = " + tester.operate(10, 5, division));
    
            // 不用括号
            GreetingService greetService1 = message -> System.out.println("Hello " + message);
    
            // 用括号
            GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
    
            greetService1.sayMessage("Runoob");
            greetService2.sayMessage("Google");
        }
    
        interface MathOperation {
            int operation(int a, int b);
        }
    
        interface GreetingService {
            void sayMessage(String message);
        }
    
        private int operate(int a, int b, MathOperation mathOperation) {
            return mathOperation.operation(a, b);
        }
    }
    

    点击查看结果

    ``` 10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello Runoob Hello Google ```

    变量作用域
    lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

    import java.util.function.Consumer;
    
    public class LambdaScopeTest {
    
        public int x = 0;
    
        class FirstLevel {
            public int x = 1;
    
            void methodInFirstLevel(int x) {
    
                // The following statement causes the compiler to generate
                // the error "local variables referenced from a lambda expression
                // must be final or effectively final" in statement A:
                //
                // x = 99;
    
                Consumer<Integer> myConsumer = (y) -> {
                    System.out.println("x = " + x); // Statement A
                    System.out.println("y = " + y);
                    System.out.println("this.x = " + this.x);
                    System.out.println("LambdaScopeTest.this.x = " + LambdaScopeTest.this.x);
                };
    
                myConsumer.accept(x);
            }
        }
    
        public static void main(String... args) {
            LambdaScopeTest st = new LambdaScopeTest();
            LambdaScopeTest.FirstLevel fl = st.new FirstLevel();
            fl.methodInFirstLevel(23);
        }
    }
    

    点击查看结果

    ``` x = 23 y = 23 this.x = 1 LambdaScopeTest.this.x = 0 ```

    lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改。(即隐性的具有 final 的语义)

    public class Java8Tester {
        public static void main(String args[]) {
            final int num = 1;
            Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
            s.convert(2);  // 输出结果为 3
        }
     
        public interface Converter<T1, T2> {
            void convert(int i);
        }
    }
    

    在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

    参考资料

  • 相关阅读:
    SubtextHTTP 模块
    asp.net控件设计时支持(2)自动格式设置
    新立得字体模糊解决经验
    详解新网银木马清除技巧
    Ubuntu 9.10 29日发布,更新列表已经公布
    小样儿想封我?WebOS 1.2.1再次突破iTunes同步限制
    检测到您尚未安装ALEXA工具条
    在Puppy Linux中安装Firefox
    一步一步教你用ES封装系统(最完整视频教程)
    C# 判断是否为数字
  • 原文地址:https://www.cnblogs.com/hgnulb/p/10051232.html
Copyright © 2020-2023  润新知