深入理解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 允许把函数作为一 ...
随机推荐
- python实现贪吃蛇
贪吃蛇的算法还是比较简单的,蛇的移动我是通过不停添加一个head方块,然后判断应该加到蛇头的哪个方向,加完后删掉蛇尾就行了,如果吃到食物就不删蛇尾. 只是一个贪吃蛇只需要70行代码左右就可以了,后来又 ...
- Mongoose 参考手册
转自:https://cnodejs.org/topic/548e54d157fd3ae46b233502 Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 ...
- svn没有"对号"等符号
[问题描述]调整svn建立好了服务端.安装客户端也检出成功了.但是就是没有对号符号. [解决方案]右键菜单,设置,里面有“图标覆盖”这个选项,把你的文件夹加入进去,然后注销windows用户重新登陆
- 解决Spring在线程中注入为空指针的问题
在启用线程中使用来jdbcTemplate来查询数据库,引入jdbcTemplate是用Spring @Autowired注解 方式引入,但是在运行中 jdbcTemplate 总是 空指针 解决 ...
- LeetCode OJ-- Binary Tree Maximum Path Sum ***
https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ 给一棵二叉树,路径可以从任一点起,到任一点结束,但是可以连成一个路径的.求 ...
- 洛谷——P1227 [JSOI2008]完美的对称
P1227 [JSOI2008]完美的对称 题目描述 在峰会期间,必须使用许多保镖保卫参加会议的各国代表.代表们除了由他自己的随身保镖保护外,组委会还指派了一些其他的特工和阻击手保护他们.为了使他们的 ...
- 2016北京集训测试赛(六)Problem A: 冒泡排序
Solution 观察冒泡排序的过程. 我们注意到, 每一轮的排序都会使得每个数后面比它小的数的个数减\(1\). 我们用\(f(n, m)\)表示对\(1\)到\(n\)的一个排列进行冒泡排序, 满 ...
- mysql之日期函数
写在前面 mysql的学习,断断续续,今天就接着学习mysql的日期操作吧. 系列文章 mysql之创建数据库,创建数据表 mysql之select,insert,delete,update mysq ...
- z pre-pass 相关问题的讨论
z pre-pass 是指在渲染流程中,第一个pass先画一张深度buffer出来,得到需要绘制的最前面这层深度,用这个在接下来的pass中做深度剔出,这样在第二个pass中会省略很多绘制. 这项技术 ...
- Web支持可暂停的超大文件上传
代码镇顶:https://github.com/dna2github/petalJS/blob/master/upload 前些天遇到用户须要上传10GB大小以上的文件的需求,查查网上的库.都不好用. ...