Как объединить два IntStreams? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу создать 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 ]

0 голосов
/ 11 февраля 2019

Вы переходите на 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 (end isэксклюзив)

0 голосов
/ 13 апреля 2019

Проблема в том, что вы создаете Stream из IntStream с Stream.conact(), где вы получаете 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());

Вы также должны использовать IntStream.rangeClosed() вместо IntStream.range()если вы хотите, чтобы 129 и 200 были частью результата.

0 голосов
/ 11 февраля 2019

Возможно, вы просто ищете 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...