程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Stream.flatMap() 从 char[] 到 Character 流

发布于2021-09-19 22:48     阅读(330)     评论(0)     点赞(5)     收藏(0)


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

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

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。我很困惑,但现在迷雾散去。谢谢你的好答案。


解决方案


您已使用Stream<Integer>代替Stream<Character>. 如果要使用Stream<Integer>,则需要使用IntStream::boxedmapToObj(a -> Integer.valueOf(a))如下所示:

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        char arr[] = { '1', '2', '3', '4', '5' };

        Stream<char[]> stream1 = Stream.of(arr);
        Stream<Character> chars = stream1.flatMap(item -> new String(item).chars().mapToObj(a -> (char) a));
        chars.forEach(c -> System.out.print(c + " "));

        System.out.println();

        Stream<char[]> stream2 = Stream.of(arr);
        Stream<Integer> ints = stream2.flatMap(item -> new String(item).chars().boxed());
        ints.forEach(i -> System.out.print(i + " "));

        System.out.println();

        Stream<char[]> stream3 = Stream.of(arr);
        Stream<Integer> integers = stream3.flatMap(item -> new String(item).chars().mapToObj(a -> Integer.valueOf(a)));
        integers.forEach(i -> System.out.print(i + " "));
    }
}

输出:

1 2 3 4 5 
49 50 51 52 53 
49 50 51 52 53 


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/289999/e8dd6c58b31424aaf641/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0
收藏该文
已收藏

评论内容:(最多支持255个字符)