scala - 嵌套数据中深叶上的 FP 或类型级别工具 groupBy?

标签 scala group-by nested scalaz shapeless

我有一个深层嵌套的数据结构:

Seq[Seq[(String, Seq[(String, Seq[(String, Try[Boolean])])], Long)]]

在 Try.isFailure 上有一个很好的功能方式来进行 groupBy 吗?

使用 Shapeless 可以在任意嵌套数据结构中进行搜索,如 here 所示。 。但寻找只是我的问题的一部分。我看到了 zipper 和镜片,它们很不错,但据我所知,它们不是合适的工具。

作为信息,数据表示某些测试代码的结果。这些层是: 配置排列 => 测试组件 => 数据突变 => 测试代码。字符串是描述,long 是完成每个组件测试所花费的时间。 我想创建两个列表,一个列表包含所有失败,保留所有发生位置和时间的信息,将异常保留为信息,另一个列表包含成功的信息。

已经有解决方案了吗?

注意:针对该特定情况,最明智的方法是重新设计我的测试代码,以便从一开始就创建两个列表,一个失败列表和一个成功列表。但我还是想知道。这种问题似乎并不罕见。

最佳答案

这可能不是最具创意的解决方案,但您可以按如下方式对最外层的 Seq 进行分区:

val partitioned = seq.partition{ s =>
  val flat = s.map(_._2).flatten.map(_._2).flatten
  flat.find(tup => tup._2.isFailure).isDefined
}

在此示例中,partition 主体中的第一行展平了嵌套结构,因此您只剩下最内部的 Seq。然后,从这里开始,通过查看最内部的 Seq 是否包含至少一个 Failure 来派生为 partition 调用返回的谓词条件。您剩下的是一个元组,其中第一个 Seq 是“嵌套结构中出现故障的最外层项目,第二个是没有发生故障的项目”。

这可能不是性能最好的解决方案,但就代码行而言它很简洁。事实上,您甚至可以按如下方式在一行中完成此操作:

val partitioned = seq.partition(_.map(_._2).flatten.map(_._2).flatten.find(_._2.isFailure).isDefined) 

关于scala - 嵌套数据中深叶上的 FP 或类型级别工具 groupBy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16170359/

相关文章:

php - 为什么这些嵌套的 while 循环不起作用?

javascript - 将 HTML 表单数据转换为嵌套 JSON

regex - 使用正则表达式匹配两个字符串之间的字符串

scala - 根据 scala 中工资列的平均值映射新列值(将字符串转换为 int)

sql - Oracle PLSQL 按状态或范围分组检查

mysql - 对每对求和 mysql 结果

python - 使用 Pandas 进行分组数据帧的统计

scala - 使用 http4s 打开 Websocket 连接

scala - 更新不可变对象(immutable对象)

scala - Scala 注解实际上是什么?