我想用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());
附带说明一下,如果您打算在流中包含
129
和200
,则应使用IntStream.rangeClosed
(结尾是排他的)