Java8的Lambda表达式简介
先阐述一下JSR(Java Specification Requests)规范,即Java语言的规范提案。是向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,可以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。可以理解为JSR是Java开发者以及授权者指定的标准,而Java开发者以及授权者形成一个JCP国际组织。职能是制定Java标准,即所有的规范都是有迹可循的。
在Java8中推出的lambda表达式(参考JSR-335,地址为https://jcp.org/en/jsr/detail?id=335),官方的描述是:扩展Java语言以支持紧凑的lambda表达式(闭包),以及相关的语言和库功能,以使JavaSE的API能够使用lambda有效表达。通俗的理解为通过lambda表达式的本质是语法糖(Syntactic sugar,在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性),其底层还是通过编译器自动推断并生成匿名类来实现。可以使用更少的代码来实现同样的功能,使代码简洁的同时也使得Java支持闭包的功能。详见list.stream()和java.util.function包下提供了诸多的function接口。
lambda表达式的语法:
(parameters) -> expression 或
(parameters) -> { statements; },
即() -> {},等同于 new Interface(){}
讲了一堆废话,贴代码吧:
package com.mengyao.bigdata.lambda; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Map、List和class的lambda使用
* lambda本质是 (parameters) -> expression; 或者 (parameters) -> { statements; }。即() -> {},等同于 new Interface(){}
* @author mengyao
*
*/
public class Test1 { public static void main(String[] args) {
// ==== 1 ==== Map的lambda示例,jdk8之前的写法就不贴出来了
Map<String, Integer> map = new HashMap<String, Integer>() {{
put("spark", 1);
put("storm", 1);
put("hadoop", 1);
put("flink", 1);
}};
/**
* parameters确定
* map.forEach参数为java.util.function.BiConsumer<? super String, ? super Integer> action,是一个接口的声明,
* 实现采用的是for(Map.Entry<K, V> entry : entrySet())将entry的k和v作为参数传递到action.accept(k,v)中 验证,到此k,v参数已确定。
* expression使用
* 接下来是给到lambda的expression来使用
* 所以如下3个map.forEach同理
*/
map.forEach((k,v) -> System.out.println(k+":"+v));
map.forEach((k,v) -> {System.out.println(k+":"+v);});
map.forEach((k,v) -> {
if (k.equals("spark")) {
System.out.println(k+":"+v);
}
}); System.out.println("===="); // ==== 2 ==== List的lambda示例
List<String> list = new ArrayList<String>(10) {{
add("spark");
add("storm");
add("hadoop");
add("flink");
}};
// 与map.forEach同理
list.forEach(System.out::println);//System.out是PrintStream的实例,::println即为调用System.out对象的println方法
list.forEach(item -> System.out.println(item));
list.forEach(item -> {System.out.println(item);});
list.forEach(item -> {
if (item.equals("spark")) {
System.out.println(item);
}
}); //==== 3 ==== 自定义类的lambda使用
// 接口类非lambda方式使用
System.out.println("==== "+new MathService() {
@Override
public int plus(int a, int b) {
return a+b;
}
}.plus(1, 2)); // 接口类lambda方式使用1(实现plus方法)
MathService service = (a,b) -> a+b;
System.out.println("==== "+service.plus(1, 2));
// 接口类lambda方式使用2,将接口的实现作为参数
print((a,b)->a+b); } /**
* 使用接口作为参数,通常方法内部会调用接口的方法
* @param service
*/
static void print(MathService service) {
int a =1,b=2;
System.out.println(service.plus(a, b));
} }
interface MathService {
//return a+b
int plus(int a, int b);
}
补充一下,稍后会上传一些复杂用例。
Java8的Lambda表达式简介的更多相关文章
- Java8中Lambda表达式的10个例子
Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 //Before Java 8: new Thread(new Runnable() { @Overri ...
- java8的lambda表达式,将List<DTO> 转为 List<DO>
将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...
- Java8特性Lambda表达式
Lambda 表达式 简介: Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). (parame ...
- java8的lambda表达式
关于java8的lambda表达式 lambda表达式一般用于接口,因为lambda表达式是函数式编程. 1.有且仅有一个抽象方法被称为函数式接口,函数式接口可以显示的被@FunctionalInte ...
- java8:(Lambda 表达式简介)
JDK8的新特性——Lambda表达式 JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分 ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- Lambda表达式 简介 语法 示例
Lambda 表达式也称为闭包,是匿名类的简短形式.Lambda 表达式简化了[单一抽象方法声明接口]的使用,因此 lambda 表达式也称为功能接口. 在 Java SE 7 中,单一方法接口可使用 ...
- java8之lambda表达式(1)-基本语法
lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double ...
- java8之lambda表达式入门
1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ privat ...
随机推荐
- cmake & make
大家都知道,写程序大体步骤为: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执行文件,如.exe. 但如果源文件太多,一个一个编译时 ...
- C#下载网页
System.Net.WebClient wc = new System.Net.WebClient(); Byte[] pageData = wc.DownloadData("网页地址&q ...
- 路由分发原则 get最终传递给get post最终传递给post
- html的body内标签之input系列2
一,input系列:name属性用于让后台拿数据.value 只是在屏幕上的显示. 1. input type='text' name='query' value="张三"(相当于 ...
- 分享几款常用的API/文档浏览器
1.Dash 支持平台:Mac iOS 官网:https://kapeli.com/dash 2.Zeal 支持平台:Linux Windows 官网:https://zealdocs.org/ G ...
- 【单调队列】【P2627】 修剪草坪
传送门 Wa这次竟然不是Uva的题 Description 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希 ...
- 【并查集】【P1525】关押罪犯
传送门 Description Input Output Sample Input Sample Output Hint Solution 非常显然的并查集题目,在本题中,对于每个罪犯i,维护两个信息 ...
- 如何设置Eclipse使用JDK
1.打开Eclipse,选择Windows->Preferences,如图所示: 2.配置本地安装的jdk,如图所示: 注意:首先要先安装JDK. 木头大哥所发的文章均基于自身实践, ...
- 仅此一文让你明白ASP.NET MVC 之View的显示
有些人要问题,为什么我要学框架?这里我简单说一下,深入理解一个框架,给你带来最直接的好处: 使用框架时,遇到问题可以快速定位,并知道如何解决: 当框架中有些功能用着不爽时,你可以自由扩展,实现你想要的 ...
- 背景建模技术(二):BgsLibrary的框架、背景建模的37种算法性能分析、背景建模技术的挑战
背景建模技术(二):BgsLibrary的框架.背景建模的37种算法性能分析.背景建模技术的挑战 1.基于MFC的BgsLibrary软件下载 下载地址:http://download.csdn.ne ...