@@ -15,8 +15,7 @@ language: ja
1515Scala と同様に、Java
1616にも豊富なコレクションライブラリがある。両者には多くの共通点がある。例えば、両方のライブラリともイテレータ、` Iterable ` 、集合、マップ、そして列を提供する。しかし、両者には重要な違いもある。特に、Scala では不変コレクションに要点を置き、コレクションを別のものに変換する演算も多く提供している。
1717
18- 時として、コレクションを一方のフレームワークから他方へと渡す必要がある。例えば、既存の Java のコレクションを Scala のコレクションであるかのようにアクセスしたいこともあるだろう。もしくは、Scala のコレクションを Java のコレクションを期待している Java メソッドに渡したいと思うかもしれない。Scala は [ ` JavaConversions ` ] (http://www.scala-lang.org/api/{{ site.scala-version }}/scala/collection/JavaConversions$.html) オブジェクトにより主要なコレクション間の暗黙の変換 (implicit conversion)
19- を提供するため、簡単に相互運用できる。特に以下の型に関しては、双方向変換を提供する。
18+ 時として、コレクションを一方のフレームワークから他方へと渡す必要がある。例えば、既存の Java のコレクションを Scala のコレクションであるかのようにアクセスしたいこともあるだろう。もしくは、Scala のコレクションを Java のコレクションを期待している Java メソッドに渡したいと思うかもしれない。Scala は [ JavaConverters] (http://www.scala-lang.org/api/{{ site.scala-version }}/scala/collection/JavaConverters$.html) オブジェクトにより主要なコレクション間の暗黙の変換を提供するため、簡単に相互運用できる。特に以下の型に関しては、双方向変換を提供する。
2019
2120 Iterator <=> java.util.Iterator
2221 Iterator <=> java.util.Enumeration
@@ -27,25 +26,25 @@ Scala と同様に、Java
2726 mutable.Map <=> java.util.Map
2827 mutable.ConcurrentMap <=> java.util.concurrent.ConcurrentMap
2928
30- このような変換を作動させるには、[ ` JavaConversions ` ] (http://www.scala-lang.org/api/{{ site.scala-version }}/scala/collection/JavaConversions $.html) オブジェクトからインポートするだけでいい:
29+ このような変換を作動させるには、[ JavaConverters ] (http://www.scala-lang.org/api/{{ site.scala-version }}/scala/collection/JavaConverters $.html) オブジェクトからインポートするだけでいい:
3130
32- scala> import collection.JavaConversions ._
33- import collection.JavaConversions ._
31+ scala> import collection.JavaConverters ._
32+ import collection.JavaConverters ._
3433
35- これで Scala コレクションとそれに対応する Java コレクションの自動変換が行われる 。
34+ これで ` asScala ` 及び ` asJava ` 拡張メソッドを呼び出すことで Scala コレクションとそれに対応する Java コレクションの変換が行われる 。
3635
3736 scala> import collection.mutable._
3837 import collection.mutable._
39- scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3)
38+ scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3).asJava
4039 jul: java.util.List[Int] = [1, 2, 3]
41- scala> val buf: Seq[Int] = jul
40+ scala> val buf: Seq[Int] = jul.asScala
4241 buf: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3)
43- scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2)
42+ scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2).asJava
4443 m: java.util.Map[String,Int] = {hello=2, abc=1}
4544
4645内部では、このような変換は全ての演算を委譲する「ラッパー」オブジェクトを作ることで実現されている。そのため、Java と Scala の間でコレクションを変換してもコレクションはコピーされることはない。興味深い特性として、例えば Java 型から対応する Scala 型に変換して再び Java 型に逆変換するといった、ラウンドトリップを実行した場合、始めた時と同一のオブジェクトが返ってくるというものがある。
4746
48- Scala コレクションの中には、 Java 型に変換できるが、逆変換はできないというものもある 。それらは以下の通り:
47+ 他の Scala コレクションも Java に変換できるが、元の Scala 型には逆変換できない 。それらは以下の通り:
4948
5049 Seq => java.util.List
5150 mutable.Seq => java.utl.List
@@ -54,8 +53,9 @@ Scala コレクションの中には、Java 型に変換できるが、逆変換
5453
5554Java は可変コレクションと不変コレクションを型で区別しないため、例えば ` scala.immutable.List ` からの変換は、上書き演算を呼び出すと ` UnsupportedOperationException ` を発生する ` java.util.List ` を返す。次に具体例で説明する:
5655
57- scala> jul = List(1, 2, 3)
56+ scala> val jul = List(1, 2, 3).asJava
5857 jul: java.util.List[Int] = [1, 2, 3]
58+
5959 scala> jul.add(7)
6060 java.lang.UnsupportedOperationException
61- at java.util.AbstractList.add(AbstractList.java:131 )
61+ at java.util.AbstractList.add(AbstractList.java:148 )
0 commit comments