我想用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()

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

最佳答案

您向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(结尾是排他的)

10-08 20:10