Lambda 表达式

Posted weixuqin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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));

以上是关于Lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

Lambda 表达式的演示样例-来源(MSDN)

线程池Lambda表达式

:Java之lambda表达式

表达式 lambda 和语句 lambda 的区别

C++11 ——— lambda表达式

C++11 ——— lambda表达式