从字符列表 "List<Character>" 转换为字符数组 "char[]"

Convert from a list of characters "List<Character>" to an array of chars "char[]"

Java 中将 List<Character> list 转换为字符数组 char[] chars 的方法是什么。

我想要这个,以便稍后我可以使用 String(chars) 创建一个 String。 我们有使用 Stream 的快捷方式吗?

我看到我们可以从 List<Integer>(或 DoubleLong)转换为 int[](或 double[]long[] ),但类似的功能不适用于 char,因为我们没有 IntStream?

的等效字符

如果我们有快速的方法,请提出建议。

我当前的代码是:

new String(getCharArray(charList))
private static char[] getCharArray(List<Character> charList) {
    char[] charArray = new char[charList.size()];
    for (int i = 0; i < charArray.length; i++) {
        charArray[i] = charList.get(i);
    }
    return charArray;
}

TL;DR

您可以(例如)使用:

list.stream().map(Object::toString).collect(Collectors.joining()).toCharArray();

但是,如果您想将其作为 String 直接执行:

list.stream().map(Object::toString).collect(Collectors.joining());

详细解答

I see that we can convert from List (...) but similar functionality is not available for char as we do not have a char equivalent for IntStream?

是的,因为您可以结合内置方法 mapToInttoArray 来获得 免费 的转换。这同样不适用于 char 类型。尽管如此,您仍然可以使用通用 map,转换为 String,然后再次转换为字符数组:

  list.stream().map(Object::toString).collect(Collectors.joining()).toCharArray();

I want this so that later I can create a String using String(chars). Do we have any shortcuts using Stream?

那为什么不直接做呢?!:

String collect = list.stream()
                     .map(String::valueOf)
                     .collect(Collectors.joining());

运行 示例:

public static void main(String[] args) {
    List<Character> list = List.of('H', 'e','l','l','o');
    String collect = list.stream().map(String::valueOf).collect(Collectors.joining());
    System.out.println(collect);
}

输出

Hello
private static char[]  getCharArray(List<Character> charList) {
    return charList.stream()
        .map(String::valueOf)
        .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
        .toString()
        .toCharArray();
  }

请注意,这是在构建 String,它由 Java 内部的 char[] 支持。来自 toCharArray()

的文档

Converts this string to a new character array.

Returns: a newly allocated character array whose length is the length of this string and whose contents are initialized to contain the character sequence represented by this string.

因此,这将在内部创建两个 char[](一个用于支持字符串)和 toCharArray returns 一个具有相同内容的新数组。

没有 Streams 也可以做到。查看class List 的方法toArray(T[] a)。它正是你想要的。您需要做的就是:

Character[] charArray = charList.toArray(new Character[charList.size()]);

没有特殊的Stream方法可以将List<Character>转换为基元数组char[],但是你可以自己做IntStream,例如:

List<Character> list = List.of('a', 'b', 'c');

char[] chars = new char[list.size()];

IntStream.range(0, list.size()).forEach(i -> chars[i] = list.get(i));

System.out.println(Arrays.toString(chars)); // [a, b, c]

将每个 Character 转换为 String 非常慢
所以所以

int[] tmp = list.stream().mapToInt( c -> c ).toArray();

仅转换为 String 一次

String rslt = new String( tmp, 0, tmp.length );

如果你也需要 char[]

char[] array = rslt.toCharArray();

(有人需要List<Character>干什么?)