【问题标题】:collecting column of multidimensional array to set收集要设置的多维数组的列
【发布时间】:2019-01-09 19:52:39
【问题描述】:

我有一个属性this.sudoku,它是一个int[9][9] 数组。 我需要将其中的一列放入一个集合中。

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

我希望这个集合中有一个列值。但它说Collectors.toSet() 不能应用于链中的这个收集函数。谁能解释一下原因?

【问题讨论】:

  • 收集到一组时要小心。除了答案中解释的mapToObj 错误之外,Collectors.toSet() 返回的Set 实现不会对其元素施加顺序。因此,您可能会丢失行的顺序,即返回集合的第一个元素与对应于第一行的元素不匹配。您最好收集到List

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


【解决方案1】:

IntStream#map 使用 IntUnaryOperator,它表示对 单个 int 值操作数 的操作,该操作产生 int 值结果,因此结果是 @987654325 @,但是 IntStream 没有您尝试使用的 collect 重载,这意味着您有几个选择;即要么使用IntStream#collect:

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

或使用mapToObjIntStream 转换为Stream&lt;Integer&gt;,然后您可以调用.collect(Collectors.toSet())

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

【讨论】:

    【解决方案2】:

    IntStream#map 接受一个IntUnaryOperator,这是一个将int 转换为另一个int 的函数。

    如果您想继续使用IntStream,也可以。但是如果你需要把流收集成Set&lt;Integer&gt;,你需要把你的IntStream变成一个IntStream#boxed的盒装ints,一个Stream&lt;Integer&gt;的流。

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

    Collectors.toSet()不能应用于链中的这个collect函数

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-07
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2022-11-11
      • 2017-03-15
      • 1970-01-01
      相关资源
      最近更新 更多