概述

Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。

你可以将其想做一种速记,在你需要使用某个方法的地方写上它。当某个方法只使用一次,而且定义很简短,使用这种速记替代之尤其有效,这样,你就不必在类中费力写声明与方法了。

Lambda 表达式的结构

一个 Lambda 表达式可以有零个或多个参数

参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同

所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)

空圆括号代表参数集为空。例如:() -> 42

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

Lambda 表达式的主体可包含零条或多条语句

如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致

如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空

什么是函数式接口

在 Java 中,Marker(标记)类型的接口是一种没有方法或属性声明的接口,简单地说,marker 接口是空接口。相似地,函数式接口是只包含一个抽象方法声明的接口。

语法

parameter -> expression body

下面是一个lambda表达式的重要特征。

可选类型声明 - 无需声明参数的类型。编译器可以从该参数的值推断。

可选圆括号参数 - 无需在括号中声明参数。对于多个参数,括号是必需的。

可选大括号 - 表达式主体没有必要使用大括号,如果主体中含有一个单独的语句。

可选return关键字 - 编译器会自动返回值,如果主体有一个表达式返回的值。花括号是必需的,以表明表达式返回一个值。

变量作用域:

  在lambda表达式,可以指任何最终的变量或有效的最后一个变量(被分配一次)。如果变量被二次赋值,lambda表达式将抛出编译错误。

小牛试刀

实践是检验真理的唯一标准,哈哈,请看

new Thread(new Runnable() {

        @Override
public void run() {
System.out.println("我是传统的写法");
}
}).start();
//------------------------------------------------------------ new Thread(() -> System.out.println("我是Lambda的写法")).start();

输出结果:

从以上代码可以看出使用Lambda表达式的好处就是节省代码量,因为使用Lambda表达式只需要一行代码可以搞定的事情使用传统写法需要6行代码。

如果您认为Lambda表达式只是用来简化代码量的话,那您就大错特错了,哈哈,下面请看Lambda表达式更高级用法

1、 forEach遍历输出

奉上代码:

List list = new ArrayList();

    list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println("传统遍历输出方式");
for(String str : list){
System.out.println(str);
}
System.out.println("Lambda表达遍历输出方式");
list.forEach(System.out::println);

输出结果:

2、条件过滤

奉上代码:

List list = new ArrayList();

    for(int i = 0 ;i < 100; i++)
list.add(i);
//过滤小于90的数字
List<Integer> newList = list.stream().filter(a -> a >90).collect(Collectors.toList());
newList.forEach(System.out::println);

输出结果:

3、批量增、减操作

奉上代码:

    List<Double> list = Arrays.asList(3000.0,5000.0,8000.0,10000.0,20000.0,50000.0);
//大BOSS发话,从现在开始每个程序员涨薪 30%
System.out.println("------------传统写法");
for(Double salary : list){
System.out.println(salary * 1.3);
}
System.out.println("------------Lambda 表达式写法");
list.stream().map(a -> a*1.3).forEach(System.out::println);

输出结果:

4、求最大值、最小值、平均值

奉上代码:

List list = new ArrayList();

    for(int i = 0 ;i < 100; i++)
list.add(i);
IntSummaryStatistics iss =list.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("最大值: "+iss.getMax());
System.out.println("最小值: "+iss.getMin());
System.out.println("平均值: "+iss.getAverage());

输出结果:

————————————————

版权声明:本文为CSDN博主「不甘于平凡的溃败」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wohiusdashi/article/details/88980803

最新文章

  1. 禅道PMS兼容redmine用户认证接口
  2. Spring Data JPA初使用(转载)
  3. 在没装VS2010的机器上运行VS2010开发的C++程序
  4. log4net各种Filter使用
  5. codevs4247奇特的生物 解析报告
  6. sublime text修改TAB缩进为2个空格
  7. DB、ETL、DW、OLAP、DM、BI关系结构图
  8. Android Launcher 怎样去掉主菜单,全部应用摆在桌面,相似小米桌面
  9. 【转】XCode、Cocoa、Objective-C 的关系区别
  10. iOS基础 - 完善键盘处理
  11. Linux脚本学习随记
  12. javascript操作json
  13. 项目管理目标:添加人员并向其分配任务 - Project
  14. ECMA Script 6_symbol(symbol.iterator) 新接口_iterator接口
  15. 共识机制:AngelToken技术的根基
  16. 跟着underscore学防抖
  17. P3813 [FJOI2017]矩阵填数(组合数学)
  18. menson 使用方法
  19. CSS3标签显示模式
  20. 技能树升级——Chrome Headless模式 - 全栈客栈 - SegmentFault

热门文章

  1. 手动从零使用ELK构建一套搜索服务
  2. mysql 触发器实现级联删除有外键的多张表
  3. 2019-5-21-win10-uwp-xaml-兼容多个版本条件编译
  4. 启动 AXD 配置开发板
  5. JS对象 String 字符串对象定义字符串的方法就是直接赋值。比如: var mystr = &quot;I love JavaScript!&quot;
  6. VBA字典做数据有效性
  7. vue(1) 第一个例子
  8. Largest Submatrix
  9. maven创建archetyp一直显示runing
  10. VPGAME的Kubernetes迁移实践