使用 Java 8 中的功能,转换列表的所有值的最简洁方法是啥? [复制]

Posted

技术标签:

【中文标题】使用 Java 8 中的功能,转换列表的所有值的最简洁方法是啥? [复制]【英文标题】:Using the features in Java 8, what is the most concise way of transforming all the values of a list? [duplicate]使用 Java 8 中的功能,转换列表的所有值的最简洁方法是什么? [复制] 【发布时间】:2013-11-09 16:50:33 【问题描述】:

使用 Java 8 的新特性,转换 List<String> 的所有值的最简洁的方法是什么?

鉴于此:

List<String> words = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");

我目前正在这样做:

for (int n = 0; n < words.size(); n++) 
    words.set(n, words.get(n).toUpperCase());

Java 8 中新的 Lambdas、Collections 和 Streams API 如何提供帮助:

    就地转换值(不创建新列表)

    将值转换为新的结果列表。

【问题讨论】:

【参考方案1】:

这是我想出的:

给定列表:

List<String> keywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");

(1) 原地改造

也许我错过了它,似乎没有一个“应用”或“计算”方法需要一个 lambda 列表。因此,这与旧 Java 相同。我想不出用 Java 8 更简洁或有效的方法。

for (int n = 0; n < keywords.size(); n++) 
    keywords.set(n, keywords.get(n).toUpperCase());

虽然有这种方式并不比 for(..) 循环更好:

IntStream.range(0,keywords.size())
    .forEach( i -> keywords.set(i, keywords.get(i).toUpperCase()));

(2) 转换并创建新列表

List<String> changed = keywords.stream()
    .map( it -> it.toUpperCase() ).collect(Collectors.toList());

【讨论】:

对于(1)做keywords.replaceAll(String::toUpperCase) 是的!!!这就是我一直在寻找的答案!!太棒了。【参考方案2】:

也许在集合中使用新的流概念:

List<String> keywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");
//(1)
keywords = keywords.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
//(2)
List<String> uppercaseKeywords = keywords.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());

【讨论】:

(1) 不起作用,因为 stream().map( ...) 只返回另一个流 ...但是 (2) 确实起作用。不确定我是否喜欢 Arrays.asList(...) 部分。 不那么麻烦。我更正了(1)。类似于(2),但我认为所有的方式都通过collect方法或数组转换。 (1) 现在生成一个新列表......我希望我遗漏了一些东西,或者可能有一些其他 API 需要一个列表和一个函数来应用:( Java 8) 好吧,toUppercase() 也是如此,它不会改变字符串而是返回一个新字符串。也许这是 Java 的方式,你知道,不要担心底层细节,有一个垃圾收集器可以清理你无用的对象和魔法优化:D 我只考虑传入 List 并且需要对调用者捕获的同一个 List 进行修改的情况,例如 Collections.sort(.. .) 或其他一些列表转换函数。否则,是的,Java 魔法应该可以解决所有问题 :)

以上是关于使用 Java 8 中的功能,转换列表的所有值的最简洁方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java 8:将具有字符串值的映射转换为包含不同类型的列表

确定变量是不是等于值“列表”中的值的最简洁方法

在 Java 中将 List 转换为 Set 的最简单方法

通过流将带有列表的列表对象转换为Java 8中的映射[重复]

将 ListBox.items 转换为通用列表的最简洁方法

检查数组是不是包含Java中的值的最有效方法? [复制]