先阐述一下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);
}

  补充一下,稍后会上传一些复杂用例。

最新文章

  1. ORB-SLAM(六)回环检测
  2. Android 中的 WebView实现 Html5 标签网页加载
  3. 浅析Java异常
  4. CSS3媒体查询
  5. HDU-4035 Maze (概率DP求期望)
  6. python (1)一个简单的爬虫: python 在windows下 创建文件夹并写入文件
  7. 获取week of year的小程序
  8. HTML5 自适应rem布局
  9. 利用php的ob缓存机制实现页面静态化
  10. HBase笔记--自定义filter
  11. Android OS体系结构详解
  12. Everything工具使用
  13. Web3D
  14. 阿里云申请ssl证书
  15. 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装
  16. DevExpress v17.2新版亮点—DevExtreme篇(三)
  17. 如何使用socket进行java网络编程(五)
  18. C# 模拟网站登陆
  19. 菜鸟也能学cocos2dx3.0 浅析刀塔传奇(下)
  20. 使用getRequestDispatcher跳转后 能获取到request.setAttribute数据 分析

热门文章

  1. WIN7使用过360系统急救箱后出现的任务计划程序文件夹删除的办法
  2. sublime text 3103 怎么设置中文
  3. JVM(一)运行机制
  4. [剑指Offer] 47.求1+2+3+...+n
  5. 请问:在delphi中怎样判断DBgrid中数据是否被修改,以便在退出窗口时加以提示
  6. 关键系统的JVM参数推荐
  7. [洛谷P3346][ZJOI2015]诸神眷顾的幻想乡
  8. BZOJ1568:[JSOI2008]Blue Mary开公司——题解
  9. CF449C:Jzzhu and Apples——题解
  10. 国庆 Day1