zoukankan      html  css  js  c++  java
  • Lambda 表达式实例

    public class Java8Tester {
    /**
    *

    语法

    
    

    lambda 表达式的语法格式如下:

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

    以下是lambda表达式的重要特征:

    
    
    • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
    • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
    • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
    • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

    */
    public static void main(String args[]) { Java8Tester tester = new Java8Tester(); // 类型声明 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"); }

    /**

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

    * 变量作用域

    
    

    */

    尽管salutation未明显定义final语义,但其实隐性具有了final的语义,所以此时再去修改salutation值,会编译不通过

    
    

    @Test

    
    

    public void paramDomain() {

    
    

    GreetingService greetService1 = message -> System.out.println(salutation + message);

    
    

    greetService1.sayMessage(" World");

    
    

    }

    private int operate(int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } }
    output:
    10 + 5 = 15
    10 - 5 = 5
    10 x 5 = 50
    10 / 5 = 2
    Hello Runoob
    Hello Google

    /**

    *Java 8中允许接口实现方法, 而不是简单的声明, 这些方法叫做默认方法,使用特殊的关键字default
    因为默认方法不是抽象方法,所以不影响我们判断一个接口是否是函数式接口

    */

    interface GreetingService {

    void sayMessage(String message);

     

    default void say(String message) {

    System.out.println("hi,"+message);

    }

     

     

    }

     

    @Test

    public void paramDomain1() {

    GreetingService greetService1 = (p) -> {};

     

     

     

    greetService1.sayMessage("d");

    greetService1.say(" jay");

     

    }

     

    output:

    hi, jay

  • 相关阅读:
    为什么Java中字符串是不可变的
    面试问题-使用Java线程做数学运算
    Java中静态类型检查是如何进行的
    Java是如何处理别名(aliasing)的
    Java字符串中常见的10个问题
    深入理解“HelloWorld”小程序
    往文件中按行写入数据
    HashSet vs TreeSet vs LinkedHashSet
    FileOutputStream VS FileWriter
    CentOS下添加Root权限用户(超级用户)方法
  • 原文地址:https://www.cnblogs.com/zhangfengshi/p/9283759.html
Copyright © 2011-2022 走看看