Как работать со значением, собирая IntStream внутри лямбда-функции - PullRequest
2 голосов
/ 10 ноября 2019

Допустим, у меня есть IntStream, и я хотел бы получить, например, список элементов из некоторой коллекции things, индекс которой находится в этом потоке.

Я думал, что это будет так же просто, как

IntStream.range(0, 10).collect(Collectors.toList(
    _i -> things[_i]
))

но возникает проблема несовместимых типов (<lambda parameter> против int). <lambda parameter> не может быть приведено к Integer. Это удивило меня, потому что похожий метод toMap, кажется, работает нормально, если я добавлю boxed() в поток - тогда тип лямбда-параметра будет java.lang.Object вместо <lambda parameter>:

IntStream.range(0, 10).boxed().collect(Collectors.toMap(
    _i -> things[_i], _i -> 1
))

Я использую Java 12.

Как мне добиться подобного поведения в методе toList, или если то, что я пытаюсь сделать, является плохой идеей - почему и каков будет хороший альтернативный подход?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2019

1) Я хотел бы получить, например, список предметов из некоторых коллекционных вещей, индекс которых находится в этом потоке

Для первого вопроса вы должны использовать mapToObj промежуточная операция, чтобы получить элементы из другого list, используя index и собрать их в List

List<ObjectType> res = IntStream.range(0, 10)
                                .mapToObj(i-> things.get(i))   // or mapToObj(things::get)
                                .collect(Collectors.toList());

2) Это удивило меня, потому что похожий метод toMap, кажется, работает нормально, если я добавлю boxed () в поток

Для второго вопроса boxed () создаст Stream из Integer (например, Stream<Integer>), где Stream имеет собирать , чтобы собрать результат в Map с помощью Collectors.toMap . Вот статья с дополнительной информацией

Поток

<R,A> R collect(Collector<? super T,A,R> collector)

Коллекторы

public static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper,
                                                Function<? super T,? extends U> valueMapper)
1 голос
/ 10 ноября 2019

Это удивило меня, потому что похожий метод toMap, кажется, работает нормально

Вы можете сделать это с помощью того же способа карты, используя mapToObj, как, например,

List<Thing> collect = IntStream.range(0, 10)
        .mapToObj(_i -> things[_i])
        .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...