如何连接两个IntStream?

Xtr*_*mer 8 java java-stream

我想List<String>用72-129和132-200的数值创建一个.我想过使用一个IntStream并将值映射到字符串并收集到列表中.我用过这段代码:

List<String> strings72to200 = Stream
        .concat(Stream.of(IntStream.range(72, 129)), Stream.of(IntStream.range(132, 200)))
        .map(e -> String.valueOf(e)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但是,如果我调试实际值strings72to200,我得到这个:

[java.util.stream.IntPipeline$Head@56d13c31, java.util.stream.IntPipeline$Head@5f9127c5]
Run Code Online (Sandbox Code Playgroud)

我相信这个Stream.concat()以及.map()导致这个问题,因为我有一个像这样的工作代码:

List<String> strings50to59 = IntStream.range(50, 60).mapToObj(e -> String.valueOf(e))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

请注意,这件作品使用的是.mapToObj()代替.map().

所以问题是,如何通过流创建一个包含这些值的列表(注意初始拆分)(因为这看起来比循环更平滑)?我应该创建完整列表并在之后删除不需要的项目(在更大的间隙上不可行)吗?

ern*_*t_k 7

你传递给concat两个Stream<IntStream>,这将无法工作(你想要一个整数流).你需要给它两个Stream<Integer>:

List<String> strings72to200 = Stream
        .concat(IntStream.range(72, 129).boxed(), 
                IntStream.range(132, 200).boxed())
        .map(String::valueOf)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

只是一个附注,如果你打算包括129200在流中,你应该使用IntStream.rangeClosed(结束是独家的)

  • 为什么不简单地使用`IntStream.concat(IntStream.range(72, 129), IntStream.range(132, 200)) .mapToObj(String::valueOf) .collect(Collectors.toList())`? (2认同)