深入理解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 允许把函数作为一 ...
随机推荐
- 汇编中的 imul 指令
1.这是整形乘法指令,无论是 unsigned int 还算是 signed int 实际上指令都是进行相同的运算,只不过最终的结果是由程序中的类型来做相应的解读 2.imul 指令实际上不会发生 o ...
- LOJ#2084. 「NOI2016」网格
$n,m \leq 1e9$,$n*m$的网格中有$c \leq 1e5$个是黑的,其他是白的.问:使至少两个白的不连通,最少需要再把几个白的涂黑. 可以发现答案是-1,0,1,2啦.-1要么没白的, ...
- .NET and php
原文发布时间为:2011-12-29 -- 来源于本人的百度文章 [由搬家工具导入] http://www.php-compiler.net/blog/2011/phalanger-3-0
- 《手把手教你学C语言》学习笔记(1)---C语言的特点
学习C语言的原因,主要是需要使用C语言编程,我用故我学,应该是最主要的原因了. C语言的定位:C语言严格意义上只能算是中级语言,是面向过程编程语言的集大成者,虽然这种语言有很多的问题,但总体而言是瑕不 ...
- win10下怎么配置以KDiff3作为merge tool和diff tool
系统环境: OS: Windows 10 Git 2.6.1.windows.1 KDiff3 0.9.98 (64 bit) 具体代码如下: git config --global --add me ...
- Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法
Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法跟Ubuntu 12.04 - 13.10 以及jellybean编译环境配置没多大区别, 顺便记录下而已: Ub ...
- hdu 2582(数论相关定理+素数筛选+整数分解)
f(n) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Cryptography I 学习笔记 --- 信息完整性
1. ECBC-MAC,需要一对密钥k与k1,然后将明文分组,用cbc模式对明文分块加密,将最后的密文块再用k1进行加密,即可得到结果 2. NMAC,需要一对密钥k与k1,然后将明文分组,用k加密第 ...
- 深度学习_2_CNN
Basic Conception: 感受野(Reception Field) 权值共享(shared weights) 池化,即降采样(sub-Sampling) 卷积核(kernel,filter) ...
- Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】
D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...