Lambda的 forEach 慎用,因为没办法跳出循环体啊

VSole2022-08-12 17:27:49

01、情景展示

如上图所示,我们想要终止for循环,使用return。

执行结果如下:

我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。

也就是说,关键字"return",在这里执行的效果相当于普通for循环里的关键词continue"。

02、原因分析

我们知道,在普通for循环里面,想要提前结束(终止)循环体使用"break";

结束本轮循环,进行下一轮循环使用"continue";

另外,在普通for里,如果使用"return",不仅强制结束for循环体,还会提前结束包含这个循环体的整个方法。

而在Java8中的forEach()中,"break"或"continue"是不被允许使用的,而return的意思也不是原来return代表的含义了。

我们来看看源码:

forEach(),说到底是一个方法,而不是循环体,结束一个方法的执行用什么?当然是return啦;

java8的forEach()和JavaScript的forEach()用法是何其的相似,感兴趣的可以去了解下(在文末)。

Java不是万能的,不要再吐槽它垃圾了。

03、解决方案

方案一:使用原始的foreach循环

使用过eclipse的老铁们应该知道,当我们输入:foreach,再按快捷键:Alt+/,就会出现foreach的代码提示。

如上图所示,这种格式的for循环才是真正意义上的foreach循环。

在idea中输入,按照上述操作是不会有任何代码提示的,那如何才能在idea中,调出来呢?

for循环可以提前终止。

方式一:break

方式二:return(不推荐使用)

方案二:抛出异常

我们知道,要想结束一个方法的执行,正常的逻辑是:使用return;

但是,在实际运行中,往往有很多不突发情况导致代码提前终止,比如:空指针异常,其实,我们也可以通过抛出假异常的方式来达到终止forEach()方法的目的。

如果觉得这种方式不友好,可以再包装一层。

这样,就完美了。

这里,需要注意的一点是:要确保你forEach()方法体内不能有其它代码可能会抛出的异常与自己手动抛出并捕获的异常一样;

否则,当真正该因异常导致代码终止的时候,因为咱们手动捕获了并且没做任何处理,岂不是搬起石头砸自己的脚吗?

lambda
本作品采用《CC 协议》,转载必须注明作者和本文链接
情景展示 原因分析 解决方案 情景展示如上图所示,我们想要终止 for 循环,使用 return。 执行结果如下:
前言 1、这篇文章讲了什么? 文本围绕三个问题 lambda会遇到什么攻击场景 什么情况下,在lambda中读取到的env环境变量密钥可以让我们接管服务器甚至整个账号 什么情况下,可以通过lambda权限去横向到其他的EC2服务器 本文会对这三个问题进行解答,并且进行演示
尽管发现的首个样本危害不大,但已经能够看到攻击者是如何利用云专业知识入侵复杂的云基础设施。
JDK8是近年来Java最重要的一次更新。其引入的一系列函数式编程特性,例如lambda表达式,已经被Java开发者广泛使用。然而,lambda的使用也存在缺陷漏洞以及兼容性等问题。我们针对这些问题开展了实证研究并获得了重要发现。
这种新的恶意软件被Cado安全研究人员称为Dennia。
他们直接联系AWS API,进一步枚举帐户,进而收集信息和泄露数据。不幸的是,AWS集群角色错误配置,拥有过大的读取权限。本意是允许读取特定的S3存储桶,但权限允许角色读取帐户中的一切,这使攻击者得以进一步了解AWS帐户,包括Lambda。受影响的AWS帐户中有不同的Lambda函数,主要与帐户自动化有关。还有证据表明攻击者执行了盗取的软件。
日本国家级应急响应机构的职能由 NISC 与 JPCERT/CC 共同负责,JPCERT/CC 在恶意软件分析领域中做了许多探索和实践。
根据代码得出 sb的值为页码+时间戳 "page=21652931584"。再次hook Sign函数查看参数和返回值并与fiddler对比。此时已经可以断定,这个Sign就是翻页的加密函数 。我们用python实现一下。此时直接调用sign生成加密参数,抓取100页的值相加得出flag:#!
VSole
网络安全专家