java - 如何使用 java 流仅替换 List<Character> 的第一个元素而不对列表的其余部分进行任何更改?

标签 java lambda java-8 java-stream

我得到一个列表,我想用“$”符号替换此列表中的第一个值,以便我可以在其他地方使用它。但我不希望列表中的其余字符放错位置或更改。可以将结果作为新列表获取。

我已经尝试过只使用 list.add(index, value) 函数,但它改变了列表的顺序。但我不想对列表的其余部分进行任何更改。

是否有学习 java 流的好的教程。我觉得掌握起来很困惑。提前致谢。

如果输入列表是 ('H','E','L','L','O') 输出应该完全像 ('$','E','L','L ','O').

最佳答案

您可以使用索引访问列表。如果索引为零,则将其map$,否则将其发送到流处理管道的下一步。最后收集到一个List中。如果您使用的是 Java8,这种方法比修改源容器要好。这是它的样子。

List<Character> updatedList = IntStream.range(0, chars.size())
    .mapToObj(i -> i == 0 ? '$' : chars.get(i))
    .collect(Collectors.toList());

这个问题不适合使用 Java8 流来很好地解决。这里的一个缺点是它以线性时间运行,看起来我们使用 java8 对它进行了过度设计。相反,如果你直接修改你的数组或列表 chars[0] = '$';,那么你只能在常数时间内完成。此外,命令式方法更紧凑、可读性更强,并且显然视觉上的困惑更少。我刚刚发布了 Java8 的实现方式,因为您已经明确要求这样做。但在我看来,对于这个特定实例,命令式方法要好得多。使用数组并设置第 0 索引,或者如果出于某种原因需要继续使用 List,请考虑使用 List.set相反,如上面的评论所述。

关于java - 如何使用 java 流仅替换 List<Character> 的第一个元素而不对列表的其余部分进行任何更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57901685/

相关文章:

java - 如何避免使用递归调用使 executorservice 拥塞/停滞/死锁

java - 无法将 chrome 连接到 HttpsServer

java - 使用 BufferedWriter 写入字符串

java - 我应该预初始化一个在多个分支中被覆盖的变量吗?

java - 我找不到教程中显示的 android.jks 文件

python - 我应该如何将我的 s3 凭证传递给 AWS 上的 Python lambda 函数?

c++ - 使用模板将 lambda 解析为函数

java - 如何正确编码完整的 http url 字符串?

java - 使用函数式接口(interface) (lambda) 从 POJO 列表中收集值

java - 内存如何分配给 lambda |它是如何被非父类(super class)引用变量引用的