我想用数字值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()
。
问题是,如何通过流使用这些值(请注意初始拆分)创建列表(因为这似乎比循环更平滑)?我是否应该创建完整列表并随后删除不需要的项目(如果差距较大,则不可行)?
答案 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());
还有一点说明,如果您打算在流中包含129
和200
,则应使用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
创建IntStream
个Stream.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());
如果您希望129
和200
成为结果的一部分,还应该使用IntStream.rangeClosed()
而不是IntStream.range()
。