首页 > 解决方案 > Stream.flatMap() 从 char[] 到字符流

问题描述

import java.util.*; 
import java.util.stream.*; 

class Playground { 

    public static void main(String[] args) 
    { 
        // Creating a character array 
        char arr[] = { '1', '2', '3', '4', '5' }; 

        // --------- Using Stream.of() --------- 
        // Will work efficiently 

        // to convert int array into Stream 
        Stream<char[]> stream = Stream.of(arr); 
        Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a));

        // Displaying elements in Stream 
        s.forEach(str -> System.out.print(str + " ")); 
    } 
} 

我正在尝试使用 flatMap() 将 char[] 转换为字符流,但出现以下错误

./Playground/Playground.java:14: error: incompatible types: inference variable R has incompatible bounds
        Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a));
                                          ^
    equality constraints: Integer
    lower bounds: U,Character
  where R,T,U are type-variables:
    R extends Object declared in method <R>flatMap(Function<? super T,? extends Stream<? extends R>>)
    T extends Object declared in interface Stream
    U extends Object declared in method <U>mapToObj(IntFunction<? extends U>)
1 error

需要帮助了解错误以及如何完成此任务。具体来说,这是如何使用从 char[] 到字符流的 flatMap() 修复这行代码的。

Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a))

编辑:所以问题结果不是关于 Stream 而是关于 lambda 表达式,我在意外修复 lambda 表达式后抽搐了线路并弄乱了打字。原来的行是

Stream<Character> s = stream.flatMap(item->{new String(item).chars().mapToObj(a->(char)a);});

问题是 {} 中缺少 return 语句。然后我把这条线改成

Stream<Integer> s = stream.flatMap((item)->new String(item).chars())

因为我认为 IntStream::mapToObj 造成了麻烦,但是我最后忘记了 boxed() 并得到了另一个类型错误,所以我添加了 IntStream::mapToObj 并发布了问题,但忘记将 Stream 类型更改回 Character。我很困惑,但现在雾已经散去。谢谢你的好答案。

标签: javajava-streamlambda

解决方案


你快到了。只需替换Stream<Integer>to Stream<Character>,因为您char在代码中转换为 a 。

但是,关于您的代码的问题是您不必要地flatMappingStream.of期望一个具有引用类型的数组作为其复合类型。此外,Arrays.stream对于 没有重载char[]。你最终会流过一些保证是单个元素的东西。该元素是您的char[].

您可以删除flatMap操作,直接将 char 数组转换为字符串。

String str = new String(arr);
Stream<Character> characterStream = str.chars().mapToObj(c -> (char) c);

推荐阅读