2

我得到了一个深度嵌套的数据结构:

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

在 Try.isFailure 上进行分组是否有一种很好的功能方式?

使用 Shapeless,可以在任意嵌套数据结构中进行搜索,如此处所示。但发现只是我问题的一部分。我看到了拉链和镜片,它们很好,但它们不是这里的正确工具。

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

已经有解决方案了吗?

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

4

1 回答 1

2

它可能不是最有创意的解决方案,但您可以partition将最外层的 Seq 如下:

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

在此示例中,partition正文中的第一行将嵌套结构展平,因此您只剩下最里面的Seq. 然后,从那里,返回partition调用的谓词条件是通过查看最内层是否Seq包含至少一个而得出的Failure。剩下的是一个元组,其中第一个Seq是在其嵌套结构中有“失败”的最外层项目,第二个是没有发生失败的项目。

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

val partitioned = seq.partition(_.map(_._2).flatten.map(_._2).flatten.find(_._2.isFailure).isDefined) 
于 2013-04-23T14:44:53.217 回答