我知道对于object,我们可以按照我们喜欢的方式对每个集合进行更新和更新,但是对于像Strings这样的不可变对象,我们如何用新对象更新数组而不再将它转换为数组。
例如,我有一个字符串数组。我想迭代每个字符串并修剪它们。否则我不得不做这样的事情:
Arrays.stream(str).map(c -> c.trim()).collect(Collectors.toList())
最后,我会得到一个List而不是我最初给出的String []。它经过了大量的处理。有什么方法可以做类似的事情:
for(int i = 0; i < str.length; i++) {
str[i] = str[i].trim();
}
使用java流?
答案 0 :(得分:8)
Streams不用于操纵其他数据结构,尤其不用于更新其源。但Java API不仅仅包含Stream API。
由于Alexis C.已shown in a comment,您可以使用Arrays.setAll(arr, i -> arr[i].trim());
当你拥有真正的大数组时,甚至可以使用parallelSetAll
。
但是,仅使用Arrays.asList(arr).replaceAll(String::trim);
可能更容易。
请记住Arrays.asList
返回的包装器允许通过List
接口修改包装数组。仅支持添加和删除。
答案 1 :(得分:3)
使用toArray
:
str = Arrays.stream(str).map(c -> c.trim()).toArray(String[]::new);
这里的缺点(超过原始的Java 7循环)是创建一个新数组来存储结果。
要更新原始数组,您可以使用Stream
重新编写循环,但我不确定重点是什么:
IntStream.range (0, str.length).forEach (i -> {str[i] = str[i].trim();});
答案 2 :(得分:2)
这可能没有你想象的那么多处理,数组具有已知的大小,并且其中的分裂器将是SIZED,因此在处理之前将得知所得到的集合大小,并且可以提前分配它的空间,无需重新调整集合大小。
同样有趣的是,在没有实际测试的情况下,我们几乎总是认为这是缓慢或内存饥饿。
当然,如果你想要一个数组作为结果,有一个方法:
.toArray(String[]::new);