【问题标题】:What's the best way to get an object from Java Enumeration without code loops?在没有代码循环的情况下从 Java Enumeration 获取对象的最佳方法是什么?
【发布时间】:2014-07-15 17:29:41
【问题描述】:

使用 Scala 从 Java 枚举中获取对象的最佳方法是什么?我正在使用 while 循环检索此值,但我想使用 .map() 之类的东西并无需编写循环即可获得此值:

private def getMsgId(mimeMessage: MimeMessage): String = {
    var msgId: String = null
    val iterator = enumerationAsScalaIterator(mimeMessage.getAllHeaders())
    breakable {
      while (iterator.hasNext) {
        val header = iterator.next.asInstanceOf[Header]
        if (header.getName().equalsIgnoreCase("MessageId")) {
          msgId = header.getValue()
          break
        }
      }
    }
    return msgId;
}

在不使用 while 或 for 等循环的情况下获取值“header.getValue()”的另一种选择是什么?

提前致谢。

【问题讨论】:

    标签: scala loops mapreduce


    【解决方案1】:

    注意:如果您的函数实际上可能没有找到您正在寻找的消息 ID,则它应该返回 Option[String]。 话虽如此,已经存在从 Enumeration[A] 到 Scala 的 Iterator[A] 的隐式转换,您只需:

    import collection.JavaConversions.enumerationAsScalaIterator
    

    然后:

     mimeMessage.getAllHeaders
                .find(_.getName.equalsIgnoreCase("MessageId")
                .map(_.getValue)
    

    这将返回Option[String]

    【讨论】:

    • 我收到错误消息“值 getName 不是 ?0 的成员”。知道如何在这里进行“演员”吗?
    • @DavidL。如果枚举是通用的,那么迭代器也应该是通用的。如果出于某种原因,情况并非如此,您应该将.map(_.asInstanceOf[Header]) 放在.find 之前。
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多