使用java流更新字符串数组

时间:2016-12-15 10:03:38

标签: arrays string java-8 java-stream

我知道对于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流?

3 个答案:

答案 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);