如何串联两个IntStream?

时间:2019-02-11 11:36:21

标签: java java-stream

我想用数字值72-129和132-200创建一个List<String>。我考虑过使用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());

但是,如果我调试strings72to200的实际值,我会得到:

[java.util.stream.IntPipeline$Head@56d13c31, java.util.stream.IntPipeline$Head@5f9127c5]

我相信Stream.concat().map()都是造成这种情况的原因,因为我确实有一段类似的代码:

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

请注意,本文使用.mapToObj()而非.map()

问题是,如何通过流使用这些值(请注意初始拆分)创建列表(因为这似乎比循环更平滑)?我是否应该创建完整列表并随后删除不需要的项目(如果差距较大,则不可行)?

3 个答案:

答案 0 :(得分: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());

还有一点说明,如果您打算在流中包含129200,则应使用IntStream.rangeClosed(结尾是排他的)

答案 1 :(得分:2)

您可能只是在寻找boxed来获得Stream<Integer>然后串联:

List<String> strings72to200 = Stream.concat(
            IntStream.range(72, 129).boxed(), // to convert to Stream<Integer>
            IntStream.range(132, 200).boxed())
        .map(String::valueOf) // replaced with method reference 
        .collect(Collectors.toList());

编辑 :如果只是从给定的输入中获取IntStream,则可以将它们串联为:

IntStream concatenated =  Stream.of(
        IntStream.range(72, 129),
        IntStream.range(132, 200))
    .flatMapToInt(Function.identity());

或简单地

IntStream concatenated =  IntStream.concat(
        IntStream.range(72, 129),
        IntStream.range(132, 200));

答案 2 :(得分:0)

问题在于,您正在使用Stream创建IntStreamStream.conact()的{​​{1}},在此您获得Stream<IntStream>而不是Stream<Integer>。您可以只使用IntStream.concat()来解决此问题:

List<String> result = IntStream.concat(IntStream.rangeClosed(72, 129), IntStream.rangeClosed(132, 200))
        .mapToObj(String::valueOf)
        .collect(Collectors.toList());

如果您希望129200成为结果的一部分,还应该使用IntStream.rangeClosed()而不是IntStream.range()