可以说我有一个Element对象(实际上来自JDom)。它可能有一个称为“Group”的子元素,也可能没有。如果确实如此,则它可能具有称为“ID”的属性,或者可能没有。我想要ID值(如果存在)。

如果是Java,我会写。

private String getId(Element e) {
  for (Element child : e.getChildren())
    if (child.getName().equals("Group"))
      for (Attribute a : child.getAttributes())
        if (a.getName().equals("ID"))
          return a.getValue();
  return null;
}

在斯卡拉,我有一个
  val id = children.find(_.getName == "Group") match {
        case None => None
        case Some(child) => {
            child.getAttributes.asScala.find(_.getName == "ID") match {
                case None => None
                case Some(a) => Some(a.getValue)
            }
        }
    }

或者
val id = children.find(_.getName == "Group").
             map(_.getAttributes.asScala.find(_.getName == "ID").
             map(_.getValue).getOrElse("")).getOrElse("")

他们中的哪一个或三分之一更惯用

最佳答案

这个怎么样?

val idOption = children
   .find(_.getName == "Group")
   .flatMap(_.getAttributes.asScala.find(_.getName == "ID"))

或者,对于理解:
val idOption =
  for {
    child <- children.find(_.getName == "Group")
    id <- child.getAttributes.asScala.find(_.getName == "ID")
  } yield id

关于scala - 嵌套选项的惯用Scala,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13607136/

10-12 06:26