Lambda 表达式

摘要:
但是在Java中,lambda表达式是对象,它们必须附加到一种特殊类型的对象——函数接口3;它是一个未声明的方法,没有访问修饰符、返回值声明和名称。匿名函数的返回类型与正文表达式一致。如果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 表达式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Request 接收参数乱码原理解析jq+jsonp+ajax解决跨域问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java函数式编程

1.函数式接口 1.1概念:java中有且只有一个抽象方法的接口。 1.2格式: 修饰符 interface接口名称 { public abstract返回值类型 方法名称(可选参数信息); //其他非抽象方法内容 } //或者 public interfaceMyFunctionalInterface { voidmyMethod(); }...

Spring Cloud Finchley.SR1 版本的坑:placeholer占位符无法解析!

接入nacos 之后,想把所有的配置丢上去。 启动程序是: @EnableDiscoveryClient @RestController @ComponentScan(basePackages = {"com.lkk"}) @MapperScan(basePackages = {"com.lkk.ppm.doc.service.dao"}) @Im...

使用lambda调用有参函数

package com.mayikt.service; /** * @ClassName YouShenInterface * @Author 蚂蚁课堂余胜军 QQ644064779 www.mayikt.com * @Version V1.0 **/ @FunctionalInterface public interface YouShenIn...

Lamda表达式

2020/02/01 【面试】请你说说Lamda表达式的优缺点。 考察点:Java基础 参考回答: 优点:1. 简洁。2. 非常容易并行计算。3. 可能代表未来的编程趋势。 缺点:1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)2. 不容易调试。3. 若其他程序员没有学过 lambda 表达式,代...

Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)

示例代码如下: package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date 2019/6/9 23:40 * @Version 1.0 */ public enum AlarmGrade {...

05-03 主成分分析(PCA)

目录 主成分分析(PCA) 一、维数灾难和降维 二、主成分分析学习目标 三、主成分分析详解 3.1 主成分分析两个条件 3.2 基于最近重构性推导PCA 3.2.1 主成分分析目标函数 3.2.2 主成分分析目标函数优化 3.3 基于最大可分性推导PCA 3.4 核主成分分析(KPCA) 四、主成分分析流程 4.1 输入 4.2 输出...