Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java->;Scala移除迭代器<;T>-元素,该元素来自JavaConversions包装的Iterable_Scala_Scala 2.8 - Fatal编程技术网

Java->;Scala移除迭代器<;T>-元素,该元素来自JavaConversions包装的Iterable

Java->;Scala移除迭代器<;T>-元素,该元素来自JavaConversions包装的Iterable,scala,scala-2.8,Scala,Scala 2.8,我必须将以下代码从Java翻译成Scala: EDIT:在源代码中添加if语句(在第一个版本中忘记了它们) for(迭代器i=getUnhandledExceptionQueuedEvents().Iterator();i.hasNext();) { 如果(某些条件){ ExceptionQueuedEvent=i.next(); 试一试{ //做点什么 }最后{ i、 删除(); } } } 我正在使用JavaConversions库包装Iterable。但由于我没有使用原始迭代器,我不知道

我必须将以下代码从Java翻译成Scala:

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

for(迭代器i=getUnhandledExceptionQueuedEvents().Iterator();i.hasNext();)
{
如果(某些条件){
ExceptionQueuedEvent=i.next();
试一试{
//做点什么
}最后{
i、 删除();
}
}
}
我正在使用JavaConversions库包装Iterable。但由于我没有使用原始迭代器,我不知道如何像在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.collection.JavaConversions_
(...)

对于(val event当您使用JavaConversions包装Java集合时,您只需要得到一个对象,该对象将Java集合调整为适当的Scala特征(接口)。在Java中,您可能会看到同样的情况(例如,您可以想象一个适配器类实现迭代器接口并包装枚举)唯一的区别是,在Scala中,您可以将“隐式”修饰符添加到声明中,以告知编译器在使代码编译时自动插入对该方法的调用


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

这是否说明了如何实现所需的功能

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>val l1=List(“如何”、“做”、“我”、“爱”、“你”)
l1:List[java.lang.String]=List(如何、做、我、爱、你)

scala>val evens=for(w感谢所有的帮助。因此我不得不不使用javaconversion。但是它看起来仍然很不错&scalafied;)**

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

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

循环完成后,原始集合将可靠地清空。在执行过程中删除元素有什么意义?抱歉,忘记了if语句。我只删除了一些特定的元素。您应该记住,您始终可以直接使用Java迭代器,而不是使用任何Scala语法支持:
while(iEvent.hasNext){val ev=iEvent.next;/*使用ev做一些事情*/*或者调用iEvent.remove*/}
刚刚编辑了我的代码,我忘记了if语句-因此我不会从集合中删除所有内容。在它结束时,Java Iterable(删除了一些元素)必须仍然存在(框架代码依赖于它).谢谢你的想法。到目前为止,每一次尝试都失败了。我们将尝试更多的方法。。。
val eventsIterator = events.iterator    
for (eventsIterator.hasNext) {
  if (someCondition) {
    try {
      // do something
    } finally {
      eventsIterator.remove
    } 
  }
}