我想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
提交
取消