加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

嵌套选项的惯用Scala

发布时间:2020-12-16 19:00:31 所属栏目:安全 来源:网络整理
导读:让我说我有一个Element对象(来自JDom实际上).它可能有一个称为“组”的子元素,或者它可能不是.如果是这样,那么它可能有一个名为“ID”的属性,或者再也可能没有.我想要ID值,如果它存在. 如果Java我会写. private String getId(Element e) { for (Element chil
让我说我有一个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;
}

在斯卡拉我也有

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读