• Lambda 表达式


    Lambda 表达式

    1. 为何需要 Lambda 表达式

    • 在 Java 中, 我们无法发将函数作为参数传递给一个方法,也无法声明返回一个函数的方法
    • 在 JavaScript 中,函数参数是一个函数,返回值是另一个函数的情况是非常常见的;JavaScript 是一门非常经典的函数式语言

    2. Lambda 表达式作用

    • Lambda 表达式为 Java 添加了缺失的函数式编程特性,使我们能将函数当作一等公民看待
    • 在将函数作为一等公民的语言中,Lambda 表达式的类型是函数。但在 Java 中,Lambda 表达式是对象,他们必须依附于一类特别的对象类型 -- 函数式接口

    3. Java Lambda 概要

    Java Lambda 表达式是一种匿名函数;它是没有声明的方法,即没有访问修饰符、返回值声明和名字。

    4. Lambda 表达式作用

    传递行为,而不仅仅是值。

    • 提升抽象层次
    • API 重用性更好
    • 更加灵活

    5. Java Lamdba 基本语法

    Java 中的 Lambda 表达式基本语法(左边是参数,右边是匿名函数的具体实现

    (argument) -> {body}

    比如说

    • (arg1, arg2...) -> {body}
    • (type1 arg1, type2 arg2...) -> {body}

    6. Java Lambda 示例

    Lambda 示例说明

    // 参数为 a,b ,返回 a+b
    (int a, int b) -> {return a + b;}
    
    // 无参数,打印 Hello World
    () -> System.out.println("Hello World");
    
    // 参数为 s,打印 s 值
    (String s) -> {System.out.println(s);}
    
    // 无参数,返回 42
    () -> 42
    
    // 无参数,返回 3.14
    () -> {return 3.14}
    

    8. Java Lambda 结构

    • 当只有一个参数,且其类型可推导时,圆括号 () 可省略。例如:a -> {return a*a}

    lambda 的类型是由上下文信息来断定的

    // lambda 的类型就是 String
    String s1 = () -> {};
    
    • Lambda 表达式的主体可包含零条或多条语句
    • 如果 Lambda 表达式的主体只有一条语句,花括号 {} 可省略,并且有 return 返回值的要去掉 return 。匿名函数的返回类型与该主体表达式一致
    • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号 {} 中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空。

    大例子

    一个完整的例子:遍历 list

    外部迭代
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    for (int number: numbers) {
        System.out.println(number);
    }
    
    内部迭代
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    numbers.forEach(new Consumer<Integer>(){
        public void accept(Integer value) {
            System.out.println(value);
        }
    })
    
    使用 Lambda 表达式
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    numbers.forEach(Integer value) -> System.out.println(value);
    
    更近一步
    List<Integer> number = Arrays.asList(1, 2, 3, 4, 5, 6);
    numbers.forEach(value -> System.out.println(value));
    

    forEach 接口是函数式接口。

    方法引用
    List<Integer> number = Arrays.asList(1, 2, 3, 4, 5, 6);
    // method reference
    numbers.forEach(System.out::println);
    

    通过方法引用的方式创建函数式接口的实例。

    外部迭代和内部迭代区别:

    外部迭代需要一个迭代器对象,内部迭代List本身就可以完成。

    PS:

    发现用 compareTo 方法结合 lambda 表达式来进行数组反转实在是太好用了,哈哈哈:

    List<String> list = Arrays.asList("zhangsan", "lisi", "wangwu", "zhaoliu");
    // 匿名内部类
    Collections.sort(list, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o2.compareTo(o1);
        }
    });
    
    // lambda 表达式
    Collections.sort(list, (o1, o2) -> o2.compareTo(o1));
    
  • 相关阅读:
    get与post区别
    移动应用专项测试的思路和方法
    一个完整的http请求响应过程
    Linux基础
    浏览器输入url按回车背后经历了哪些?
    三大浏览器(火狐-谷歌-IE浏览器)驱动版本下载
    boost-序列化
    HTTP 2.0
    http首部字段
    与http协作的web服务器
  • 原文地址:https://www.cnblogs.com/weixuqin/p/11494890.html
Copyright © 2020-2023  润新知