Lambda表达式概念与基本语法
Lambda表达式是Java 8的重要更新,一个被广大开发者期待已久的新特性。Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。
//接口,用于封装处理行为。因为暂时无法确定处理行为,所以是空方法体
interface Command {
void process(int[] target);
}
//处理数组
class ProcessArray {
public void process( int[] target, Command cmd ) {
cmd.process(target);
}
}
public class Test {
public static void main(String[] args) {
ProcessArray pa = new ProcessArray();
int[] target = {3,-4,6,4};
pa.process(target, new Command() {
public void process(int[] target) {
int sum = 0;
for( int tmp : target ) {
sum+=tmp;
}
System.out.println("Summary:"+sum);
}
});
}
}
ProcessArray类的process()方法处理数组时,希望可以动态传入一段代码作为具体的处理行为,因此程序创建了一个匿名内部类实例来封装处理行为。但为了向process()方法传入这段代码,程序不得不使用匿名内部类的语法来创建对象。
Lambda表达式完全可用于简化创建匿名内部类对象,因此可将上面代码改为如下形式。
interface Command {
void process(int[] target);
}
class ProcessArray {
public void process( int[] target, Command cmd ) {
cmd.process(target);
}
}
public class Test {
public static void main(String[] args) {
ProcessArray pa = new ProcessArray();
int[] array = {3,-4,6,4};
pa.process(array,(int[]target)->{
int sum = 0;
for( int tmp:target ) {
sum+=tmp;
}
System.out.println("Summary:"+sum);
});
}
}
从上面程序中可以看出,这与创建匿名内部类时需要实现的方法完全相同,只是不需要new Xxx(){}这种繁琐的代码,不需要指出重写的方法名字,也不需要给出重写的方法的返回值类型——只要给出重写的方法括号以及括号里的形参列表即可。
当使用Lambda表达式代替匿名内部类创建对象时,Lambda表达式的代码块将会代替实现抽象方法的方法体,Lambda表达式就相当于一个匿名方法。
小结
Lambda表达式的主要作用就是代替匿名内部类的繁琐语法。它由三部分组成。
形参列表:形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
箭头
->代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号。代码块只有一条return语句,甚至可以省略return 关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。
下面示范了Lambda表达式的几种简化写法。
interface Eatable {
void taste();
}
interface Flyable {
void fly( String weather );
}
interface Addable {
int add(int a, int b);
}
public class Test {
public void eat( Eatable e ) {
System.out.println(e);
e.taste();
}
public void drive( Flyable f ) {
System.out.println("我正在驾驶:"+f);
f.fly("碧空如洗的晴日");
}
public void test (Addable add) {
System.out.println("5+3="+add.add(5,3));
}
public static void main(String[] args) {
Test t = new Test();
//Lambda语句只有一条语句,可以省略花括号
t.eat(()->System.out.println("苹果的味道不错!"));
//只有一个形参,可以省略圆括号
t.drive( weather-> {
System.out.println("今天天气是:"+weather);
System.out.println("直升机飞行平稳");
});
//只有一条语句,可以省略return
t.test((a,b)->a+b);
}
}
Lambda表达式概念与基本语法的更多相关文章
- java中使用Lambda表达式的5种语法
1,标准写法 思考下述情况: String[] arr = {"program", "creek", "is", "a" ...
- JAVA8之lambda表达式具体解释,及stream中的lambda使用
前言: 本人也是学习lambda不久,可能有些地方描写叙述有误,还请大家谅解及指正! lambda表达式具体解释 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.l ...
- C#进阶之全面解析Lambda表达式
引言 在实际的项目中遇到一个问题,我们经常在网上搜索复制粘贴,其中有些代码看着非常的简洁,比如Lambda表达式,但是一直没有去深入了解它的由来,以及具体的使用方法,所以在使用的时候比较模糊,其次,编 ...
- JAVA8之lambda表达式详解
原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...
- 对比讲解lambda表达式与传统接口函数实现方式
在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应该都掌握了,实际上还是存在大量的 ...
- 【C++】C++中的lambda表达式和函数对象
目录结构: contents structure [-] lambda表达式 lambda c++14新特性 lambda捕捉表达式 泛型lambda表达式 函数对象 函数适配器 绑定器(binder ...
- 恕我直言你可能真的不会java第1篇:lambda表达式会用了么?
本文配套教学视频:B站观看地址 在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应 ...
- java8的新特性之lambda表达式和方法引用
1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...
- Lambda表达式【转】
lambda表达式是对匿名方法的一种改进,具有更加简洁的语法和更易理解的形式,lambda表达式可以包括表达式和语句,并且可以用与创建委托或表达式目录树类型. lambda表达式都使用Lambda运算 ...
随机推荐
- JAVA进阶23
1.统计文件夹大小 package cn.demo02; import java.io.File; /** * @Classname DirTest03 * @Description TODO * @ ...
- Python:time模块/random模块/os模块/sys模块
time 模块 #常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行.单位为秒. 2.time.time() 获取当前时间戳 python中时间日期格式化符号: %y 两位数的 ...
- Activiti开发案例之activiti-app工作流导出图片
前言 自从 Activiti 和 JBPM4 分家以后,Activiti 目前已经发展到了版本7,本着稳定性原则我们最终选择了6,之前还有一个版本5. 问题 在开发使用的过程中发现 Activiti ...
- [Alpha阶段]第十次Scrum Meeting
Scrum Meeting博客目录 [Alpha阶段]第十次Scrum Meeting 基本信息 名称 时间 地点 时长 第十次Scrum Meeting 19/04/15 大运村寝室6楼 35min ...
- Node.js中的console.log()输出彩色字体
转自:https://www.jianshu.com/p/cca3e72c3ba7 console.log('\033[42;30m DONE \033[40;32m Compiled success ...
- 运行错误:Application Error - The connection to the server was unsuccessful
在模拟器上上启动ionic4.6版本 打包成的android APK,启动了很久结果弹出这个问题: Application Error - The connection to the server w ...
- plus.webview更新上一个页面的信息
let currentWebview = plus.webview.currentWebview(); let backWebview = currentWebview.opener(); ...
- 【CSS】利用宽高比例的媒体查询
aspec-ratio 取值:value (x/y) 接收min/max前缀:是 aspect-ratio描述了输出设备目标显示区域的宽高比.该值包含两个以/分隔的正整数.代表了水平像素数(第一个值) ...
- ElasticSearch搜索(一)
首先从ES的支持的字段说起,ES文档中字段有多种类型 官方文档. 这几个比较常用: text,keyword,integer,float,boolean,object,geo_point(地理坐标), ...
- [洛谷P1842] 奶牛玩杂技
题目类型:贪心+证明,经典题 传送门:>Here< 题意:有\(N\)头奶牛,每个奶牛有一个重量\(W[i]\),力量\(S[i]\).定义每个奶牛的压扁程度为排在它前面的所有奶牛的总量之 ...