深入理解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 允许把函数作为一 ...
随机推荐
- day5感想
---恢复内容开始--- 我感觉自己真的是太弱了,和那些从初中开始学的人TT 今天讲的数学,毕竟以前尖子生培训打过点基础,感觉还不错,但也仅限于听懂而已,打代码什么的…… 今天的内容: 一.数论 1. ...
- LOJ#2132. 「NOI2015」荷马史诗
$n \leq 100000$个数字,放进$k$叉树里,一个点只能放一个数,使所有数字乘以各自深度这个值之和最小的同时,最大深度的数字最小. 哈夫曼.这是我刚学OI那段时间看到的,感觉就是个很无聊的贪 ...
- MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类) Ver 1.65
原文发布时间为:2010-02-07 -- 来源于本人的百度文章 [由搬家工具导入] http://www.popub.net/script/MSClass.html/*MSClass (Class ...
- my conclusion about time planing and requirement changes.
How to estimate time when requirement changes or is added: my principle: never say so easy, at least ...
- Jobedin外企招聘网:6个要点不能不知道(转载)
又到一年跳槽季,无数职场人士都在蠢蠢欲动,在工作之余,寻找更好的工作. Jobedin外企招聘网,特别提醒:年末跳槽,一定要在拿到新公司的Offer后,才能向现公司提出辞职.不然新工作没找到,却可能丢 ...
- js禁用"Backspace"键(即禁止网页倒退)
项目遇到的一个问题一个普通网页,如果这个网页上没有焦点的话,那么点击"Backspace"键的时候,网页会回退(倒退到上一个网页),这样就会就有一个问题,当我在一个输入框进行输入的 ...
- sublime 中设置pylint
http://www.360doc.com/content/14/1110/11/15077656_424004081.shtml 安装 pylinter 插件 详见 sublime 插件安装 配 ...
- POJ 3710 Christmas Game [博弈]
题意:略. 思路:这是个删边的博弈游戏. 关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532 学习完预备知识后,这一 ...
- Springboot如何优雅的解决ajax+自定义headers的跨域请求
1.什么是跨域 由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.),凡是发 ...
- workflow engine Ruote初体验之二(通用属性)
罗列一下表达式所支持的属性: :timeout :if/ unless :forget :lose :flank :on_error :on_cancel :on_timeout :tag :filt ...