深入理解Java 8 Lambda
以上两篇博客是对lambda表达式的深入理解,用于后续加深理解。
如下先从零开始理解lambda,
1. 接触lambda表达式是从python,javascript这些弱类型语言开始的,当时也是一知半解。
感觉是直接支持了数学样式的公式,比如
(x,y) -> x + y
是不是想到了数学中类似以下的表达方式?
f(x,y) = x + y
然后仅限于此,知道有lambda表达式这个、基本会用也就拉到了。
2. Java在JDK8中引入了lambda,然后直到现在才探究下其中的使用。不过上来还是感觉不知道该怎么定义lambda和该如何使用。看了<<Effective Java>>也是云里雾里的。
还是看了这篇基础的blog才有了初步认识。
(1) lambda表达式可以认为是匿名类的一种实现
String[] strArray = {"er","zgfwdghnk","sdhgwe"};
Arrays.sort(strArray, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
}); for (String str : strArray){
System.out.println(str);
}
拿以上例子来说,在排序中需要用到Comparator的接口实现,也就是匿名类实现。而这个实现就可以用lambda替代,如下
Arrays.sort(strArray, (o1, o2) -> o1.length() - o2.length()); for (String str : strArray){
System.out.println(str);
}
lambda相比较于匿名类实现,减少那些死板的代码,只保留功能部分,更加简洁。
那是不是lambda就能完全替代匿名类实现呢?答案是不能 -> (2)
(2) lambda表达式对应的接口只能有一个抽象方法
既然lambda与匿名类实现相似,也就可以想象成lambda也是由接口支撑的。实际上,对应于lambda的接口被称为函数式接口(Functional Interface)。当然,函数式接口区别于其他接口的重要一点是,其中的抽象方法有且仅有一个。
@java.lang.FunctionalInterface
public interface FunctionalInterface<V1, V2, V3> {
String apply(V1 v1, V2 v2, V3 v3);
//String apply(String param);
}
在java.util.function包下共有43个函数式接口,应该足够用。当然也可以如上,定义自己的函数式接口。函数式接口的设计遵从接口定义的约定。
(3) lambda表达式需要依据函数式接口的输入输出类型编写,并作为函数对象传递进方法
比如以上自定义的函数式接口(包含泛型),输入类型V1, V2, V3,返回类型String,那么对应的lambda表达式就应该是(V1 x, V2 y, V3 z) -> String类型。
之后是使用lambda表达式的具体方法,如下
public class MyClass { public void testLambdaWithSelfFunctionalInternal(int[] intArray, FunctionalInterface<Integer,Integer,Integer> functionalInterface){
Objects.requireNonNull(intArray);
if (intArray.length != 3){
throw new IllegalArgumentException("3 int parameters required");
}
System.out.println(functionalInterface.apply(intArray[0],intArray[1],intArray[2]));
} }
函数式接口作为方法参数之一。将来的lambda表达式就是通过函数式接口传入的。
MyClass myClass = new MyClass();
int[] array = {1,2,3};
myClass.testLambdaWithSelfFunctionalInternal(array,(x,y,z) -> "Sum = " + String.valueOf(x+y+z));
深入理解Java 8 Lambda的更多相关文章
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- [转]深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- 深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)
转载:http://zh.lucida.me/blog/java-8-lambdas-inside-out-library-features/ 关于 深入理解 Java 8 Lambda(语言篇——l ...
- [转载]深入理解Java 8 Lambda
原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language-features/ 深入理解Java 8 Lambda(语言篇——lam ...
- 深入理解Java 8 Lambda(语言篇)
State of Lambda by Brian Goetz 原文链接:http://lucida.me/blog/java-8-lambdas-insideout-language-features ...
- 深入理解Java 8 Lambda(类库篇)
背景(Background) 自从lambda表达式成为Java语言的一部分之后,Java集合(Collections)API就面临着大幅变化.而 JSR 355(规定了 Java lambda 表达 ...
- Java 8——Lambda表达式
本篇文章不介绍Lambda的前世今生,这里只对Lambda表达的应用做详细了解.以及与内部类的差异点. Lambda表达式 Lambda表达式是Java SE 8版本中引入的新的语法糖.将功能看做方法 ...
- Java 8 Lambda表达式学习和理解
Java 8 Lambda表达式和理解 说明:部分资料来源于网络 时间:20190704 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一 ...
随机推荐
- HDOJ Important Sisters
Important Sisters Time Limit: 7000/7000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDOJ 1398 Square Coins
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- BZOJ 3538 == 洛谷 P3106 [USACO14OPEN]GPS的决斗Dueling GPS's
P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 题目描述 Farmer John has recently purchased a new car online, but ...
- SQL2005、SQL2008如何压缩日志文件(log) 如何清除日志
原文发布时间为:2010-11-01 -- 来源于本人的百度文章 [由搬家工具导入] ALTER DATABASE [DataBaseName] SET ...
- css sticky footer 布局 手机端
什么是css sticky footer 布局? 通常在手机端写页面 会遇到如下情况 页面长度很短不足以撑起一屏,此时希望页脚在页面的底部 而当页面超过一屏时候,页脚会在文章的底部 ,网上有许多办法, ...
- 【Windows Message】MFC 通过F5,刷新桌面
//通过F5,刷新桌面 HWND hWndProgram = ::FindWindow( _T("Progman"), NULL); HWND hWndDefView = ::Fi ...
- layui 自定义表单验证 以及提交表单
订购数量</span> <span style="color: red">*</span>: <input type="text ...
- python print的参数介绍
参考print的官方文档 print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints th ...
- nodejs后台启动
可避免关闭窗口,程序就关闭,可在后台运行 安装forever包,一般用于服务器,调试环境可不安装 npm install forever -g 启动方式如图: 查询后台运行哪些程序 forever l ...
- Cryptography I 学习笔记 --- 基于Diffie-Hellman的公钥加密
1. Diffie-Hellman协议: 假定g是集合G的生成元,G有n个元素. Alice随机选取1-n中的一个数a,并公布ga为公钥 Bob随机选取1-n中的一个数b,并公布gb为公钥 那么gab ...