10

Elementオブジェクト(実際にはJDomから)があるとしましょう。「グループ」と呼ばれる子要素がある場合とない場合があります。含まれている場合は、「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;
}

Scalaでは私はどちらかを持っています

  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("")

彼らのどれ、または3分の1がより慣用的です

4

1 に答える 1

14

これはどう?

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
于 2012-11-28T14:21:32.983 に答える