Собирая столбец многомерного массива для установки

У меня есть атрибут this.sudoku который является int[9][9] массив. Мне нужно получить столбец этого в наборе.

Set<Integer> sudoku_column = IntStream.range(0, 9)
                                      .map(i -> this.sudoku[i][column])
                                      .collect(Collectors.toSet());

Я ожидаю, что значения столбцов в этом наборе. но это говорит о том, что Collectors.toSet() не может быть применен к этой функции сбора в цепочке. Может кто-нибудь объяснить почему?

2 ответа

Решение

IntStream#map потребляет IntUnaryOperator которая представляет операцию над одним int-значным операндом, который производит int-значный результат, таким образом, результат является IntStream, тем не мение IntStream не имеет collect перегрузка, которую вы пытаетесь использовать, что означает, что у вас есть несколько вариантов; то есть либо использовать IntStream#collect:

IntStream.range(0, 9)
         .collect(HashSet::new, (c, i) -> c.add(sudoku[i][column]), HashSet::addAll);

или использовать mapToObj превратить из IntStream в Stream<Integer> который вы можете позвонить .collect(Collectors.toSet()) на.

IntStream.range(0, 9)
        .mapToObj(i -> this.sudoku[i][column])
        .collect(Collectors.toSet());

IntStream#map занимает IntUnaryOperator которая является функцией для преобразования int другому int,

Это хорошо, если вы хотите продолжить IntStream, Но если вам нужно собрать поток в Set<Integer> нужно повернуть IntStream в поток в штучной упаковке int с, а Stream<Integer>, от IntStream#boxed,

.map(i -> this.sudoku[i][column])
.boxed()
.collect(Collectors.toSet());

Collectors.toSet() не может быть применено к этому collect функция в цепи

Collectors.toSet() вернуть Collector который не соответствует подписи сингла collect(Supplier, ObjIntConsumer, BiConsumer) метод в IntStream, Хотя, это подходит для Stream.collect(Collector),

Другие вопросы по тегам