- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Map 使用 Lambda 的 forEach 实现跳出循环操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Lambda 的 forEach表达式用起来很爽啊,最近开发中用来遍历了一下Map,结果就翻车了......大致场景如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
static
void
main(String[] args) {
HashMap<String,String> map =
new
HashMap<>();
map.put(
"1"
,
"001"
);
map.put(
"2"
,
"002"
);
map.put(
"3"
,
"003"
);
map.put(
"4"
,
"004"
);
map.put(
"5"
,
"005"
);
map.forEach((k,v)->{
if
(v.contains(
"3"
)){
System.out.println(
"找到你了呦......"
);
return
;
}
System.out.println(v);
});
|
本来是要在找到包含了"3"的值之后终止循环的,结果break 编译错误.只好用return试试,神奇的事情发生了,并没有跳出循环,return在这里起到了continue的效果.为什么呢? --- 因为()->{}其实是匿名内部类,匿名内部类如何能使用break和continue呢,当然编译错误啊.在匿名内部类里面return了也仅仅是匿名内部类的调用终止,for循环继续下一次循环而已.所以,无奈之下,只能曲线救国了---使用 。
anyMatch 。
1
2
3
4
|
boolean
result = map.entrySet().stream().anyMatch(e -> e.getValue().contains(
"3"
));
if
(result){
System.out.println(
"找到你了呦......"
);
}
|
补充知识:java8 lambda forEach循环与增强for循环性能对比 。
最近新的项目使用jdk1.8版本,于是乎博主想多使用一些lambda的写法,但是对于lambda并不是很了解所以在网上查了一些性能方面的资料,结果瞬间心凉,多数回答为lambda forEach循环性能要比传统循环差,性能甚至差出十几倍。然而,经过博主的测试那些回答是错误的.
性能对比的结论为 lambda forEach>增强for,以下给出测试数据.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
public
static
void
main(String[] args) {
test1();
}
public
static
void
test1() {
List<User> userList = initList(
10000
);
for
(
int
i =
1
; i <
11
; i++) {
System.out.println(
"--------------------第"
+ i +
"次"
);
long
t1 = System.nanoTime();
testLambda(userList);
long
t2 = System.nanoTime();
testForeach(userList);
long
t3 = System.nanoTime();
System.out.println(
"lambda---"
+ (t2 - t1) /
1000
+
"μs"
);
System.out.println(
"增强for--"
+ (t3 - t2) /
1000
+
"μs"
);
}
}
public
static
void
test2() {
List<User> userList = initList(
10000
);
long
t1 = System.nanoTime();
testLambda(userList);
long
t2 = System.nanoTime();
testForeach(userList);
long
t3 = System.nanoTime();
testLambda1(userList);
long
t4 = System.nanoTime();
System.out.println(
"lambda---"
+ (t2 - t1) /
1000
+
"μs"
);
System.out.println(
"增强for--"
+ (t3 - t2) /
1000
+
"μs"
);
System.out.println(
"lambda1---"
+ (t4 - t3) /
1000
+
"μs"
);
}
/**
* 增强for测试
*
* @param userList
*/
private
static
void
testForeach(List<User> userList) {
for
(User user : userList) {
user.hashCode();
}
}
/**
* lambda forEach测试
*
* @param userList
*/
private
static
void
testLambda(List<User> userList) {
userList.forEach(user -> user.hashCode());
}
private
static
void
testLambda1(List<User> userList) {
userList.forEach(user -> user.hashCode());
}
/**
* 初始化测试集合
*
* @param size
* @return
*/
private
static
List<User> initList(
int
size) {
List<User> userList =
new
ArrayList<>();
for
(
int
i =
0
; i < size; i++) {
userList.add(
new
User());
}
return
userList;
}
|
测试结果:
为了验证前面的lomda表达式对后面的lomda表达式的影响,将main方法中的test1改为test2测试.
测试结果:
综上所述此时可以看出在第一次的时候两者性能相差40倍,这可能也是多数人认为它性能较差的原因,但是再后面的执行当中几乎都是lambda的执行速度快,所以博主觉得,lambda的forEach循环在首次执行的时候会初始化部分内容,从而导致执行过慢,在后续的执行当中由于不需要再次进行初始化,所以才展现出真正的实力.
因 此 博 主 推 荐 将 l a m b d a 表 达 式 的 初 始 化 放 到 项 目 启 动 的 过 程 中 , 这 样 可 以 大 大 提 高 l a m b d a 表 达 式 的 性 能 .
\color{#FF0000}{因此博主推荐将lambda表达式的初始化放到项目启动的过程中,这样可以大大提高lambda表达式的性能。}因此博主推荐将lambda表达式的初始化放到项目启动的过程中,这样可以大大提高lambda表达式的性能.
关于其他方面的测试,有兴趣的同学可以自行测试.
以上这篇Map 使用 Lambda 的 forEach 实现跳出循环操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/qq_40074764/article/details/106471929 。
最后此篇关于Map 使用 Lambda 的 forEach 实现跳出循环操作的文章就讲到这里了,如果你想了解更多关于Map 使用 Lambda 的 forEach 实现跳出循环操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在努力做到这一点 在我的操作中从数据库获取对象列表(确定) 在 JSP 上打印(确定) 此列表作为 JSP 中的可编辑表出现。我想修改然后将其提交回同一操作以将其保存在我的数据库中(失败。当我使用
我有以下形式的 Linq to Entities 查询: var x = from a in SomeData where ... some conditions ... select
我有以下查询。 var query = Repository.Query() .Where(p => !p.IsDeleted && p.Article.ArticleSections.Cou
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
以下代码产生错误 The nested query is not supported. Operation1='Case' Operation2='Collect' 问题是我做错了什么?我该如何解决?
我已经为 HA redis 集群(2 个副本、1 个主节点、3 个哨兵)设置了本地 docker 环境。只有哨兵暴露端口(10021、10022、10023)。 我使用的是 stackexchange
我正在 Desk.com 中构建一个“集成 URL”,它使用 Shopify Liquid 模板过滤器语法。对于开始日期为 7 天前而结束日期为现在的查询,此 URL 需要包含“开始日期”和“结束日期
你一定想过。然而情况却不理想,python中只能使用类似于 i++/i--等操作。 python中的自增操作 下面代码几乎是所有程序员在python中进行自增(减)操作的常用
我需要在每个使用 github 操作的手动构建中显示分支。例如:https://gyazo.com/2131bf83b0df1e2157480e5be842d4fb 我应该显示分支而不是一个。 最佳答
我有一个关于 Perl qr 运算符的问题: #!/usr/bin/perl -w &mysplit("a:b:c", /:/); sub mysplit { my($str, $patt
我已经使用 ArgoUML 创建了一个 ERD(实体关系图),我希望在一个类中创建两个操作,它们都具有 void 返回类型。但是,我只能创建一个返回 void 类型的操作。 例如: 我能够将 book
Github 操作仍处于测试阶段并且很新,但我希望有人可以提供帮助。我认为可以在主分支和拉取请求上运行 github 操作,如下所示: on: pull_request push: b
我正在尝试创建一个 Twilio 工作流来调用电话并记录用户所说的内容。为此,我正在使用 Record,但我不确定要在 action 参数中放置什么。 尽管我知道 Twilio 会发送有关调用该 UR
我不确定这是否可行,但值得一试。我正在使用模板缓冲区来减少使用此算法的延迟渲染器中光体积的过度绘制(当相机位于体积之外时): 使用廉价的着色器,将深度测试设置为 LEQUAL 绘制背面,将它们标记在模
有没有聪明的方法来复制 和 重命名 文件通过 GitHub 操作? 我想将一些自述文件复制到 /docs文件夹(:= 同一个 repo,不是远程的!),它们将根据它们的 frontmatter 重命名
我有一个 .csv 文件,其中第一列包含用户名。它们采用 FirstName LastName 的形式。我想获取 FirstName 并将 LastName 的第一个字符添加到它上面,然后删除空格。然
Sitecore 根据 Sitecore 树中定义的项目名称生成 URL, http://samplewebsite/Pages/Sample Page 但我们的客户有兴趣降低所有 URL(页面/示例
我正在尝试进行一些计算,但是一旦我输入金额,它就会完成。我只是希望通过单击按钮而不是自动发生这种情况。 到目前为止我做了什么: Angular JS - programming-fr
我的公司创建了一种在环境之间移动文件的复杂方法,现在我们希望将某些构建的 JS 文件(已转换和缩小)从一个 github 存储库移动到另一个。使用 github 操作可以实现这一点吗? 最佳答案 最简
在我的代码中,我创建了一个 JSONArray 对象。并向 JSONArray 对象添加了两个 JSONObject。我使用的是 json-simple-1.1.jar。我的代码是 package j
我是一名优秀的程序员,十分优秀!