我很好奇如何将变量传播到 java 8 中的流中。 一个例子比长篇大论更好,那么如何将以下(抽象)代码转换为流:
Map<Integer,A> myMap = new HashMap();
for (Entry<Integer,A> entry : myMap)
{
int param1=entry.getValue().getParam1();
List param2=entry.getValue().getParam2();
for (B b : param2)
{
System.out.println(""+entry.getKey()+"-"+param1+"-"+b.toString());
}
}
知道这个例子是问题的简化(例如,我在下一个 for 循环中多次需要“param1”)
到目前为止,我唯一的想法是将我需要的所有信息存储到一个元组中,以便最终在该元组上使用 forEach 流方法。 (不太清楚……)
编辑:我过于简化了我的示例。我的情况更像是这样:
Map<Integer,A> myMap = new HashMap();
for (Entry<Integer,A> entry : myMap)
{
int param1=entry.getValue().getParam1();
CustomList param2=entry.getValue().getParam2();
for (int i = 0; i<param2.size(); i++)
{
System.out.println(""+entry.getKey()+"-"+param1+"-"+param2.get(i).toString());
}
}
我可以用流写类似的东西:
myMap.entrySet().stream()
.forEach(
e -> IntStream.range(0, e.getValue.getParam2().getSize())
.forEach(
i -> System.out.println(e.getKey()+"-"+e.getValue().getParam1()+"-"+e.getValue.getParam2.get(i))
)
);
但是,在我的实际情况中,我所拥有的而不是“e.getValue.getParam2()”要复杂得多(一系列 5-6 个方法),并且比仅仅检索变量(它执行一些逻辑)要重得多,所以我想避免重复 e.getValue.getParam2 (一次在 forEach 之前,一次在 forEach 中)
我知道这可能不是使用流的最佳用例,但我正在了解它并想了解其限制
谢谢!
最佳答案
类似这样的事情:
myMap.forEach(
(key, value) -> value.getParam2().forEach(
b -> System.out.println(key+"-"+value.getParam1()+"-"+b)
)
);
也就是说,对于每个键/值对,迭代 value.getParam2()
。对于其中每一项,打印出您指定的格式的字符串。我不确定这会给你带来什么,除了基本上是你以前所拥有的,但使用流。
更新
针对您的问题的更新,回复如下:
myMap.forEach((key, value) -> {
final CustomList param2 = value.getParam2();
IntStream.range(0, param2.getSize()).forEach(
i -> System.out.println(key+"-"+value.getParam1()+"-"+param2.get(i))
)
});
这里我们将getParam2()
的结果赋给一个final变量,因此只计算一次。 Final(和 effectively final )变量在 lambda 函数内可见。
(感谢 Holger 的建议。)
关于java - 如何在 java 8 中的流中传播变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36548302/