gpt4 book ai didi

java - 如何使用 Java 8 流平面映射多个元素?

转载 作者:行者123 更新时间:2023-11-30 05:45:42 25 4
gpt4 key购买 nike

我有课

public class Step
{
boolean isActive;
String name;
}

我有一个类型为“步骤”的集合。在不使用流的情况下,这就是我目前所拥有的

  StringBuilder stringBuilder = new StringBuilder();
for (Step step : steps)
{
List<String> nextStepNames = getNextStepNames(step);
List<String> conditions = getConditions(step);
for (int i = 0; i < nextStepNames.size(); i++)
{
stringBuilder.append("If ").append(step.getName()).append("is active, and condition (").append(conditions.get(i)).append(") is true, then move to ").append(nextStepNames.get(i)).append("\n");
}
}

如果我的步骤集合包含步骤A、步骤B和步骤C, 那么这是我的输出:

If stepA is active, and condition (c1A) is true, then move to step1A
If stepA is active, and condition (c2A) is true, then move to step2A
If stepA is active, and condition (c3A) is true, then move to step3A
If stepB is active, and condition (c1B) is true, then move to step1B
If stepB is active, and condition (c2B) is true, then move to step2B
If stepB is active, and condition (c3B) is true, then move to step3B
If stepC is active, and condition (c1C) is true, then move to step1C
If stepC is active, and condition (c2C) is true, then move to step2C
If stepC is active, and condition (c3C) is true, then move to step3C

nextStepNamesconditions 列表大小相同,并且列表中的索引彼此对应。

我无法将此代码转换为流。我不确定是否可能。

最佳答案

Java缺乏以优雅的纯函数式风格高效解决问题的能力。

但是,您可以尝试类似的方法

    str = steps.stream()
.map(step ->
IntStream
.range(0, getNextStepNames(step).size())
.mapToObj(i -> Stream.of(
"If ",
step.getName(),
" is active, and condition (",
getConditions(step).get(i),
") is true, then move to ",
getNextStepNames(step).get(i),
"\n"))
.flatMap(Function.identity())
)
.flatMap(Function.identity())
.collect(Collectors.joining());

由于 getNextStepNamesgetConditions 的重复评估以及无法提前分配完整的输出缓冲区,效率非常低。

当然,您可以尝试使用第三方库来缓解此问题,但恕我直言,这不值得付出努力。

您的解决方案更加高效并且更易于理解和维护。您可以通过使用等于或略大于最终输出大小的大小初始化 StringBuilder 来进一步改进这一点。

关于java - 如何使用 Java 8 流平面映射多个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54872497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com