Собирая столбец многомерного массива для установки
У меня есть атрибут 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)
,