要设置的多维数组的收集列

时间:2019-01-09 19:52:40

标签: java java-8 set java-stream collectors

我有一个属性JavaScript: <script> var c = "<table><tr><td>1</td></tr><tr><td>2</td></tr></table>"; </script> CSS: <style> .table1 { background-color:cyan; color:red; }</style> ,它是一个this.sudoku数组。 我需要将其列放入集合中。

int[9][9]

我希望此集中有一个列值。但是它说Set<Integer> sudoku_column = IntStream.range(0, 9) .map(i -> this.sudoku[i][column]) .collect(Collectors.toSet()); 不能应用于链中的此collect函数。有人可以解释为什么吗?

2 个答案:

答案 0 :(得分:4)

IntStream#map消耗了IntUnaryOperator,它表示对单个整数值操作数的操作,该操作数生成一个 int值结果,因此该结果是IntStream,但是IntStream没有尝试使用的collect重载,这意味着您有两个选择。即使用IntStream#collect

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

或使用mapToObjIntStream转换为Stream<Integer>,然后可以调用.collect(Collectors.toSet())

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

答案 1 :(得分:4)

IntStream#map采用IntUnaryOperator,该功能是将int转换为另一个int的功能。

如果您想继续使用IntStream,那很好。但是,如果您需要将流收集到Set<Integer>中,则需要将IntStream转换为{{3} }。

int
  

.map(i -> this.sudoku[i][column]) .boxed() .collect(Collectors.toSet()); 不能应用于链中的此Collectors.toSet()函数

collect返回的Collectors.toSet()Collector中单个collect(Supplier, ObjIntConsumer, BiConsumer)方法的签名不符。不过,它适用于Stream<Integer>