[SCALA] 스칼라에서 자바 컬렉션 반복
SCALA스칼라에서 자바 컬렉션 반복
나는 아파치 POI API를 사용하여 일부 스칼라 코드를 쓰고 있어요. 나는 시트 클래스에서 얻을 java.util.Iterator를에 포함 된 행을 반복하고 싶습니다. 나는 각 스타일의 for 루프에서 반복자를 사용하고 싶습니다, 그래서 기본 스칼라 컬렉션으로 변환하려고 노력했지만 행운는 것이다.
내가 스칼라 래퍼 클래스 / 특성을 살펴 보았다,하지만 난 올바르게 사용하는 방법을 볼 수 없습니다. 어떻게 자세한 While 루프의 (hasNext ()) GETNEXT () 스타일을 사용하지 않고 내가 스칼라에서 자바 컬렉션을 반복합니까?
여기에 내가 정답을 기반으로 쓴 코드는 :
class IteratorWrapper[A](iter:java.util.Iterator[A])
{
def foreach(f: A => Unit): Unit = {
while(iter.hasNext){
f(iter.next)
}
}
}
object SpreadsheetParser extends Application
{
implicit def iteratorToWrapper[T](iter:java.util.Iterator[T]):IteratorWrapper[T] = new IteratorWrapper[T](iter)
override def main(args:Array[String]):Unit =
{
val ios = new FileInputStream("assets/data.xls")
val workbook = new HSSFWorkbook(ios)
var sheet = workbook.getSheetAt(0)
var rows = sheet.rowIterator()
for (val row <- rows){
println(row)
}
}
}
해결법
-
==============================
1.래퍼 클래스 (scala.collection.jcl.MutableIterator.Wrapper)이 있습니다. 사용자가 정의한다면
래퍼 클래스 (scala.collection.jcl.MutableIterator.Wrapper)이 있습니다. 사용자가 정의한다면
implicit def javaIteratorToScalaIterator[A](it : java.util.Iterator[A]) = new Wrapper(it)
다음은 foreach 문을 수행 할 수 있도록 스칼라 반복자의 하위 클래스 역할을합니다.
-
==============================
2.스칼라 2.8로, 당신이 할 일은 이미 적절한 변환을 선언하는 JavaConversions 개체를 가져 오는 것입니다.
스칼라 2.8로, 당신이 할 일은 이미 적절한 변환을 선언하는 JavaConversions 개체를 가져 오는 것입니다.
import scala.collection.JavaConversions._
하지만 이것은 이전 버전에서 작동하지 않습니다.
-
==============================
3.편집 : 스칼라 2.13.0는 scala.collection.JavaConverters을 deprecates, 그래서 2.13.0 이후는 scala.jdk.CollectionConverters를 사용해야합니다.
편집 : 스칼라 2.13.0는 scala.collection.JavaConverters을 deprecates, 그래서 2.13.0 이후는 scala.jdk.CollectionConverters를 사용해야합니다.
스칼라 2.12.0는 scala.collection.JavaConversions을 deprecates, 그래서 뭔가를 것이 일을 2.12.0 하나의 방법 가입일 :
import scala.collection.JavaConverters._ // ... for(k <- javaCollection.asScala) { // ... }
(가져 오기를 통지 새가되지 않는, JavaConversions JavaConverters입니다)
-
==============================
4.여기에 정답은 일부 사용자 지정 유형으로 자바의 반복자에서 암시 적 변환을 정의하는 것입니다. 이 유형은 위임 기본 반복자에 foreach는 방법을 구현해야합니다. 이것은 당신이 루프 자바 반복자와 스칼라를 사용할 수 있습니다.
여기에 정답은 일부 사용자 지정 유형으로 자바의 반복자에서 암시 적 변환을 정의하는 것입니다. 이 유형은 위임 기본 반복자에 foreach는 방법을 구현해야합니다. 이것은 당신이 루프 자바 반복자와 스칼라를 사용할 수 있습니다.
-
==============================
5.스캔 (210)의 경우 :
스캔 (210)의 경우 :
// Feature warning if you don't enable implicit conversions... import scala.language.implicitConversions import scala.collection.convert.WrapAsScala.enumerationAsScalaIterator
-
==============================
6.스칼라로 2.10.4+ (및 이전) 내재적 [A] scala.collection.JavaConversions.asScalaIterator을 가져 [A]에 scala.collection.Iterator java.util.Iterator를 변환 할 수있다. 다음은 그 예이다 :
스칼라로 2.10.4+ (및 이전) 내재적 [A] scala.collection.JavaConversions.asScalaIterator을 가져 [A]에 scala.collection.Iterator java.util.Iterator를 변환 할 수있다. 다음은 그 예이다 :
object SpreadSheetParser2 extends App { import org.apache.poi.hssf.usermodel.HSSFWorkbook import java.io.FileInputStream import scala.collection.JavaConversions.asScalaIterator val ios = new FileInputStream("data.xls") val workbook = new HSSFWorkbook(ios) var sheet = workbook.getSheetAt(0) val rows = sheet.rowIterator() for (row <- rows) { val cells = row.cellIterator() for (cell <- cells) { print(cell + ",") } println } }
-
==============================
7.당신은 배열에 자바 컬렉션을 변환하고 그것을 사용할 수 있습니다 :
당신은 배열에 자바 컬렉션을 변환하고 그것을 사용할 수 있습니다 :
val array = java.util.Arrays.asList("one","two","three").toArray array.foreach(println)
또는에 가서 스칼라 목록에 배열로 변환 :
val list = List.fromArray(array)
-
==============================
8.당신은 큰 데이터 세트를 반복하는 경우에, 당신은 아마 .asScala 암시 적 변환과 메모리에 전체 수집을로드하지 않습니다. 이 경우, 편리한 방법으로 접근 scala.collection.Iterator의 특성을 구현하는 것입니다
당신은 큰 데이터 세트를 반복하는 경우에, 당신은 아마 .asScala 암시 적 변환과 메모리에 전체 수집을로드하지 않습니다. 이 경우, 편리한 방법으로 접근 scala.collection.Iterator의 특성을 구현하는 것입니다
import java.util.{Iterator => JIterator} def scalaIterator[T](it: JIterator[T]) = new Iterator[T] { override def hasNext = it.hasNext override def next() = it.next() } val jIterator: Iterator[String] = ... // iterating over a large dataset scalaIterator(jIterator).take(2).map(_.length).foreach(println) // only first 2 elements are loaded to memory
그것은 IMO 유사한 개념 미만 자세한 정보가 있습니다 :
-
==============================
9.당신이 scala.collection.JavaConversions에서 implicits을 피하려는 경우 명시 적으로 변환 할 수 scala.collection.JavaConverters를 사용할 수 있습니다.
당신이 scala.collection.JavaConversions에서 implicits을 피하려는 경우 명시 적으로 변환 할 수 scala.collection.JavaConverters를 사용할 수 있습니다.
scala> val l = new java.util.LinkedList[Int]() l: java.util.LinkedList[Int] = [] scala> (1 to 10).foreach(l.add(_)) scala> val i = l.iterator i: java.util.Iterator[Int] = java.util.LinkedList$ListItr@11eadcba scala> import scala.collection.JavaConverters._ import scala.collection.JavaConverters._ scala> i.asScala.mkString res10: String = 12345678910
스칼라 반복자에 자바 Iterator를 변환하는 asScala 방법의 사용을합니다.
JavaConverters 스칼라 2.8.1부터 사용할 수있다.
from https://stackoverflow.com/questions/495741/iterating-over-java-collections-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 대 발-변경할 수 VAR-불변 (0) | 2019.11.04 |
---|---|
[SCALA] 스파크 DataFrame에 하나의 열에서 여러 열을 유도 (0) | 2019.11.04 |
[SCALA] 를 CSV로 DataFrame을 저장할 때 파일 이름을 지정 [중복] (0) | 2019.11.04 |
[SCALA] 전용 [이] 전용 VS (0) | 2019.11.04 |
[SCALA] 스칼라에서 무두질의 두 가지 방법; 각 유스 케이스는 무엇인가? (0) | 2019.11.04 |