代码之家  ›  专栏  ›  技术社区  ›  Wolkenarchitekt

Java> Scala从JavaCon版本的迭代中删除迭代器< t>元素

  •  2
  • Wolkenarchitekt  · 技术社区  · 14 年前

    我必须把下面的代码从Java翻译成斯卡拉:

    编辑:在源代码中添加了if语句(在第一个版本中忘记了它们)

    for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) 
    {
      if (someCondition) {
        ExceptionQueuedEvent event = i.next();
        try {
          //do something
        } finally {
          i.remove();
        }
      }
    }
    

    我正在使用JavaConversions库包装iterable。但是,当我不使用原始Iterator时,我不知道如何正确地从集合中移除当前元素,就像在Java中那样:

    import scala.collection.JavaConversions._
    (...)
    for (val event <- events) {
      if (someCondition) {
        try {
          // do something
        } finally {
          // how can i remove the current event from events?
          // the underlying type of events is java.lang.Iterable[javax.faces.event.ExceptionQueuedEvent]
        } 
      }
    }
    

    有人能帮我吗? 我想这很容易,但我还是有点新斯卡拉,不明白当Scala包裹一些Java时发生了什么。

    3 回复  |  直到 14 年前
        1
  •  1
  •   David Winslow    14 年前

    当您使用JavaCon版本来包装Java集合时,您只会得到一个对象,该对象将Java集合适配到适当的Scala特性(接口)。在爪哇中,您可能看到相同的东西(例如,您可以想象一个实现迭代器接口并封装枚举的适配器类)。唯一的区别是,在Scala中,可以将“隐式”修饰符添加到声明中,以告诉编译器如果它将使代码编译,则自动插入对该方法的调用。

    对于您的特定用例,scala中的迭代器出于许多原因有意省略remove()方法。从scala.collection.iterator到java.util.iterator的转换承诺在可能的情况下解包j.u.iterator,所以我想您可以依赖它来访问remove()方法。但是,如果您正在迭代整个集合并删除所有内容,为什么不在foreach循环中进行工作,然后在完成后清除集合或将其替换为空的集合呢?

        2
  •  0
  •   Randall Schulz    14 年前

    这是否意味着如何实现你想要的?

    scala> val l1 = List("How", "do", "I", "love", "you")
    l1: List[java.lang.String] = List(How, do, I, love, you)
    
    scala> val evens = for ( w <- l1; if w.length % 2 == 0 ) yield { printf("even: %s%n", w); w }
    even: do
    even: love
    evens: List[java.lang.String] = List(do, love)
    

    基本上,你得到你的scala Iterable Iterator 使用适当的隐式转换 JavaConversions 使用A for 理解,包括要处理和收集结果的元素的条件。必要时使用异常处理。

        3
  •  0
  •   Wolkenarchitekt    14 年前

    谢谢你的帮助。所以我不用JavaConversions。但它看起来仍然很漂亮。**

    这是我的最后一个代码,似乎有效:

    val eventsIterator = events.iterator    
    for (eventsIterator.hasNext) {
      if (someCondition) {
        try {
          // do something
        } finally {
          eventsIterator.remove
        } 
      }
    }