我想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());但是,如果我调试 的实际值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 回答
UYOU
TA贡献1878条经验 获得超4个赞
你传递给concat
two 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
(结尾是独占的)
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
您可能只是在寻找boxed
那里得到 aStream<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));
SMILET
TA贡献1796条经验 获得超4个赞
问题是您正在创建 a Stream
of IntStream
s 并Stream.conact()
在其中获得 aStream<IntStream>
而不是 a Stream<Integer>
。你可以IntStream.concat()
这样解决这个问题:
List<String> result = IntStream.concat(IntStream.rangeClosed(72, 129), IntStream.rangeClosed(132, 200)) .mapToObj(String::valueOf) .collect(Collectors.toList());
如果您愿意并成为结果的一部分,您也应该使用IntStream.rangeClosed()
而不是。IntStream.range()
129
200
添加回答
举报
0/150
提交
取消