JAVA : 如何在使用 lambda 处理数组项时减少代码大小

JAVA : how to reduce code size, when using lambda to process array's items

我必须按字母顺序对数组中的每一项进行排序

在 : [bcdef、dbaqc、abcde、omadd、bbbbb] 出去 : [bcdef, abcdq, abcde, addmo, bbbbb]

我写了下面的代码,但我觉得它很冗长。

能否请您告诉我另一种方式,代码更短?

谢谢。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import static java.lang.String.copyValueOf;

public class Main {

    public static void main(String[] args) {
        String[] stringsArray = { "bcdef", "dbaqc", "abcde", "omadd", "bbbbb"};

        System.out.println(Arrays.toString(stringsArray));

        List<String> list = Arrays.stream(stringsArray).map((String s)->{
            char[] charArray = s.toCharArray();
            Arrays.sort(charArray);
            return copyValueOf(charArray);
        }).collect(Collectors.toList());
        ArrayList<String> arrayList = new ArrayList<String>(list);
        stringsArray = Arrays.copyOf(arrayList.toArray(),arrayList.size(),String[].class);

        System.out.println(Arrays.toString(stringsArray));
    }

}

您似乎想对每个元素内的字符进行排序,而不是整个数组。

您可以通过单独的 map()(和 peek(),因为 Arrays.sort() 方法不返回值)步骤来简化。您还可以通过直接收集到 String 数组来跳过冗余 List

String[] sorted = Arrays.stream(stringsArray)
    .map(String::toCharArray)
    .peek(Arrays::sort)
    .map(String::new)
    .toArray(String[]::new);

如果你想修改原始数组 in-place,那么你可以依赖 Arrays.asList(),它会在数组周围创建一个 List 包装器:

Arrays.asList(stringsArray)
        .replaceAll(s -> {
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            return new String(chars);
        });

System.out.println(Arrays.toString(stringsArray));

Arrays.asList() 实际上只是原始数组的一个视图。对返回列表的任何更改实际上都将在数组上完成,并且 vice-versa。这也是为什么不能 add/remove 返回列表中的元素的原因。