前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lambda 表达式

Lambda 表达式

作者头像
希希里之海
发布2019-09-10 18:45:17
4900
发布2019-09-10 18:45:17
举报
文章被收录于专栏:weixuqin 的专栏

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 示例说明

代码语言:javascript
复制
// 参数为 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

外部迭代
代码语言:javascript
复制
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
for (int number: numbers) {
    System.out.println(number);
}
内部迭代
代码语言:javascript
复制
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 表达式
代码语言:javascript
复制
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach(Integer value) -> System.out.println(value);
更近一步
代码语言:javascript
复制
List<Integer> number = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach(value -> System.out.println(value));

forEach 接口是函数式接口。

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

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

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

PS:

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

代码语言:javascript
复制
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));
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Lambda 表达式
    • 1. 为何需要 Lambda 表达式
      • 2. Lambda 表达式作用
        • 3. Java Lambda 概要
          • 4. Lambda 表达式作用
            • 5. Java Lamdba 基本语法
              • 6. Java Lambda 示例
                • 8. Java Lambda 结构
                • 大例子
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档