如何连接两个 IntStream?

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

所以问题是,我怎样才能通过流创建一个包含这些值的列表(注意初始拆分)(因为这似乎比循环更平滑)?我是否应该创建完整列表并在之后删除不需要的项目(在更大的差距上不可行)?


Cats萌萌
浏览 160回答 3
3回答

UYOU

你传递给concattwo&nbsp;Stream<IntStream>,这不起作用(你想要一个整数流)。你需要给它两个Stream<Integer>:List<String>&nbsp;strings72to200&nbsp;=&nbsp;Stream &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.concat(IntStream.range(72,&nbsp;129).boxed(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(132,&nbsp;200).boxed()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(String::valueOf) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());顺便说一句,如果您打算在流中包含129和200,您应该使用IntStream.rangeClosed(结尾是独占的)

蝴蝶刀刀

您可能只是在寻找boxed那里得到 aStream<Integer>然后连接:List<String>&nbsp;strings72to200&nbsp;=&nbsp;Stream.concat( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(72,&nbsp;129).boxed(),&nbsp;//&nbsp;to&nbsp;convert&nbsp;to&nbsp;Stream<Integer> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(132,&nbsp;200).boxed()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(String::valueOf)&nbsp;//&nbsp;replaced&nbsp;with&nbsp;method&nbsp;reference&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());编辑:如果您只是IntStream从给定的输入中获取一个,您可以将它们连接为:IntStream&nbsp;concatenated&nbsp;=&nbsp;&nbsp;Stream.of( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(72,&nbsp;129), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(132,&nbsp;200)) &nbsp;&nbsp;&nbsp;&nbsp;.flatMapToInt(Function.identity());或者干脆IntStream&nbsp;concatenated&nbsp;=&nbsp;&nbsp;IntStream.concat( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(72,&nbsp;129), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(132,&nbsp;200));

SMILET

问题是您正在创建 a&nbsp;Streamof&nbsp;IntStreams 并Stream.conact()在其中获得 aStream<IntStream>而不是 a&nbsp;Stream<Integer>。你可以IntStream.concat()这样解决这个问题:List<String>&nbsp;result&nbsp;=&nbsp;IntStream.concat(IntStream.rangeClosed(72,&nbsp;129),&nbsp;IntStream.rangeClosed(132,&nbsp;200)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToObj(String::valueOf) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());如果您愿意并成为结果的一部分,您也应该使用IntStream.rangeClosed()而不是。IntStream.range()129200
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java