java - 如何在 java 8 中的流中传播变量

标签 java java-stream

我很好奇如何将变量传播到 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/

相关文章:

java - Android应用程序设计帮助,如何控制显示哪个 Activity

Java TimerTask 应该等待阻塞队列

带有 FDF 的 Java PDF 查看器

java - 使用流,如何映射 HashMap 中的值?

Java 8 流映射到按值排序的键列表

java - 创建函数流的更好方法?

java - 如何使用维基数据 API 或 Freebase 的替代品

java - Android Studio 从 GitHub API 请求返回异常

java - 展平 map 中的列表列表

java - 如何通过其中的某个最大值过滤流?