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 ...
随机推荐
- chrome extensions & debug
chrome extensions & debug debug background.js debug popup.js debug content_script.js chrome.stor ...
- mysql(二) 慢查询分析(一)
如下表结构: CREATE TABLE `trade_order` ( `order_id` ) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单编号', `t ...
- SpringBoot Web(SpringMVC)
入门工程: package com.example.demo.controller; import com.example.demo.entity.User; import org.springfra ...
- matlab isfield
isfield 函数功能:判断输入是否是结构体数组的域(成员). 调用格式: tf=isfield(S,'fieldname') 检查结构体S是否包含由fieldname指定的域,如果包含,返回逻辑1 ...
- BZOJ 2337 XOR和路径(概率DP)
求点1到点n经过的路径权值异或和的期望. 考虑按位计算,对于每一位来说,令dp[i]表示从i到n的异或和期望值. 那么dp[i]=sum(dp[j]+1-dp[k]).如果w(i,j)这一位为0,如果 ...
- BZOJ 1004 Cards(Burnside引理+DP)
因为有着色数的限制,故使用Burnside引理. 添加一个元置换(1,2,,,n)形成m+1种置换,对于每个置换求出循环节的个数, 每个循环节的长度. 则ans=sigma(f(i))/(m+1) % ...
- BZOJ 1415 聪聪和可可(期望DP)
我们可以用n次BFS预处理出 to[][]数组,to[i][j]表示聪聪从i点到j点第一步会走哪个点. 那么对于聪聪在i点,可可在j点,聪聪先走,定义dp[i][j]表示步数期望. 那么显然有dp[i ...
- SPOJ - PHRASES
题意: 给n个字符串,求出最长的子串.使得子串在每个字符串中不重叠地至少出现2次.输出子串长度. 题解: 用后缀数组求出height数组,之后二分答案.check时对height数组进行分组,并维护每 ...
- POJ1284:Primitive Roots——题解
http://poj.org/problem?id=1284 给一个奇质数p,求p的原根数量. 有一个结论:当正整数n存在原根时,其一共有phi(phi(n))个不同余的原根. 所以答案为phi(p- ...
- AOJ.849 分数 (暴力)
AOJ.849 分数 (暴力) 题意分析 每次枚举分子,然后根据给出的分数值,推算出来分母,然后取分母上下几个数进行进一步计算,看看哪个更接近. 一开始想着直接枚举分子和分母,复杂度爆炸... 代码总 ...