Java-&gt; Scala从JavaConversions包装的Iterable中删除Iterator <t> -Element </t>

时间:2010-06-05 17:51:01

标签: scala scala-2.8

我必须将以下代码从Java转换为Scala:

编辑:在源代码中添加了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不熟悉并且不明白当Scala包装Java时会发生什么。

3 个答案:

答案 0 :(得分:1)

当您使用JavaConversions包装Java集合时,您只需获得一个对象,该对象可以将Java集合调整为适当的Scala特征(接口)。在Java中,您可能会看到相同的事情(例如,您可以想象一个实现Iterator接口并包装Enumeration的适配器类。)唯一的区别是在Scala中您可以将'implicit'修饰符添加到声明中来告诉编译器自动插入对该方法的调用,如果它将使代码编译。

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

答案 1 :(得分:0)

这是否表明如何实现您的目标?

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)

基本上,您使用来自Iterable的相应隐式转换来获取Scala IteratorJavaConversions,使用for理解,其中包含您想要哪些元素的条件处理并收集结果。根据需要使用异常处理。

答案 2 :(得分:0)

感谢所有帮助。所以我不得不使用JavaConversions。但它看起来仍然很好并且得到了scalafied;)**

这是我的最终代码,似乎有效:

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