Java 8中无法将char[]转换为流

9

我正在编写一段程序,其中一个方法以char[][]作为输入并返回char[]。该方法如下 -

private static char[] getTableFromTwoChits(char[][] inputTwoChits) {
    Map<Character, Character> map = new HashMap<>();
    Arrays.stream(inputTwoChits).forEach(x -> map.put(x[0], x[1]));
    map.entrySet().forEach(System.out::println);
    char[] result = new char[inputTwoChits.length+1]; int index=0;
    char startPoint = inputTwoChits[0][0];
    do {
       result[index] = startPoint;index++;
       startPoint = map.get(startPoint);
    }while(startPoint != inputTwoChits[0][0]);
    result[index] = startPoint;
    return result;
}

以下是主要方法:
public static void main(String[] args) {
    char[][] inputTwoChits = {{'A','B'},{'C','D'},{'B','C'},{'E','F'},{'F','A'},{'D','E'}};
    char[] outputTwoChits = getTableFromTwoChits(inputTwoChits);
    Arrays.stream(outputTwoChits).forEach(System.out::println);

}

在方法getTableFromTwoChits()的第二行编译通过,而在main方法的第三行没有编译通过。请解释这种行为背后的原因是什么?
以下是提到的编译错误 -
/CircularTableTwoChits.java:21: error: no suitable method found for stream(char[])
        Arrays.stream(outputTwoChits).forEach(System.out::println);
              ^
    method Arrays.<T#1>stream(T#1[]) is not applicable
      (inference variable T#1 has incompatible bounds
        equality constraints: char
        upper bounds: Object)
    method Arrays.<T#2>stream(T#2[],int,int) is not applicable
      (cannot infer type-variable(s) T#2
        (actual and formal argument lists differ in length))
    method Arrays.stream(int[]) is not applicable
      (argument mismatch; char[] cannot be converted to int[])
    method Arrays.stream(long[]) is not applicable
      (argument mismatch; char[] cannot be converted to long[])
    method Arrays.stream(double[]) is not applicable
      (argument mismatch; char[] cannot be converted to double[])
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>stream(T#1[])
    T#2 extends Object declared in method <T#2>stream(T#2[],int,int)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
5个回答

11

只有四种流类型,用于intlongdouble和引用类型(对象)的元素。因此,由于不存在char流,Arrays.stream无法应用于char[]数组。

字符流的规范表示是一个IntStream,获取它的方式可以避免复制或装箱开销,如下:

CharBuffer.wrap(charArray).chars().forEach(c -> System.out.println((char)c));

由于int类型的默认解释为“整数”,因此您需要使用将其转换为char类型的lambda表达式来解释它为“字符”。

如果您不需要在字符之间换行,则可以通过以下方式在一行中打印整个数组:

System.out.println(String.valueOf(charArray));

这个解决方案可行。然而在我的情况下,我用Character[]代替了char[]。 - ash164

8
您不能使用 Arrays.stream(outputTwoChits) 创建一个 CharStream,因为在 Arrays 类中没有重载接受 char[] 并返回 CharStream 的方法(实际上根本没有 CharStream),而通过执行 Stream.of(outputTwoChits) 在这种情况下也无法提供您所期望的结果。
然而,由于您仅将此用于打印目的,因此可以执行以下操作:
Arrays.stream(new String(outputTwoChits).split("")).forEach(System.out::println);

或者从char数组构建一个String对象,然后调用它的chars方法,应该会生成一个IntStream,然后在输出到控制台之前从int映射到char。
new String(outputTwoChits).chars().forEach(c -> System.out.println((char)c));

1
这也是正确的。但一个简单的方法是用 Character[] 替换 char[]。 - ash164

5

In

Arrays.stream(inputTwoChits)

您正在将char[][]数组传递给<T> Stream<T> stream(T[] array)方法,这是可以的,因为char[]是引用类型。

另一方面,在

Arrays.stream(outputTwoChits)

您正在传递一个char[],而char不是引用类型,因此它与<T> Stream<T> stream(T[] array)的签名不匹配。

您可以使用以下方式从char[]生成IntStream

new String(outputTwoChits).chars()

这也是一个可能的解决方案。但将方法更改为返回Character[]而不是char[]也可以工作。 - ash164

3

Character 包装类

您正在尝试创建一个基本类型的 char 流。请尝试使用 包装Character。这样,您将获得所需的输出。


7
你的逻辑有误。int 同样也是原始类型,但你仍然可以在其上调用 Arrays.stream 方法。 - whatamidoingwithmylife
2
谢谢你指出这一点。你说得对,我们可以使用 arrays.stream 来创建 int、long 和 double 数组的流,分别返回 IntStream、LongStream 和 DoubleStream。但是,arrays 类中没有 char 的方法可以返回一个 char 流。 - Shailesh Tanwar
Character[] 将作为 Object[] 方法在流中存在。 - ash164

2
您可以使用静态方法IntStream.range(),如下所示创建索引流(Stream of indices),然后使用它们将charArray中的值映射到Character流:
Stream<Character> chars = IntStream.range(0, charArray.length)
    .mapToObj(i -> charArray[i]);
.mapToObj() 方法被使用,因为我们正在操作一个 IntStream 并且想要将非装箱的原始流转换为装箱的引用流。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接