我必须将以下代码从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时会发生什么。
答案 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 Iterator
或JavaConversions
,使用for
理解,其中包含您想要哪些元素的条件处理并收集结果。根据需要使用异常处理。
答案 2 :(得分:0)
感谢所有帮助。所以我不得不使用JavaConversions。但它看起来仍然很好并且得到了scalafied;)**
这是我的最终代码,似乎有效:
val eventsIterator = events.iterator
for (eventsIterator.hasNext) {
if (someCondition) {
try {
// do something
} finally {
eventsIterator.remove
}
}
}