Skip to content

Commit 5976136

Browse files
Conversions for scala collections (continued) (#77)
Co-authored-by: Felix Engl <[email protected]>
1 parent 1e8a6c0 commit 5976136

File tree

4 files changed

+358
-0
lines changed
  • kotlin-spark-api

4 files changed

+358
-0
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
@file:Suppress("NOTHING_TO_INLINE", "RemoveExplicitTypeArguments")
2+
3+
package org.jetbrains.kotlinx.spark.api
4+
5+
import scala.collection.JavaConversions
6+
import java.util.*
7+
import java.util.concurrent.ConcurrentMap
8+
import scala.collection.Iterable as ScalaIterable
9+
import scala.collection.Iterator as ScalaIterator
10+
import scala.collection.Map as ScalaMap
11+
import scala.collection.Seq as ScalaSeq
12+
import scala.collection.Set as ScalaSet
13+
import scala.collection.concurrent.Map as ScalaConcurrentMap
14+
import scala.collection.mutable.Buffer as ScalaMutableBuffer
15+
import scala.collection.mutable.Map as ScalaMutableMap
16+
import scala.collection.mutable.Seq as ScalaMutableSeq
17+
import scala.collection.mutable.Set as ScalaMutableSet
18+
19+
/**
20+
* @see JavaConversions.asScalaIterator for more information.
21+
*/
22+
fun <A> Iterator<A>.asScalaIterator(): ScalaIterator<A> = JavaConversions.asScalaIterator<A>(this)
23+
24+
/**
25+
* @see JavaConversions.enumerationAsScalaIterator for more information.
26+
*/
27+
fun <A> Enumeration<A>.asScalaIterator(): ScalaIterator<A> = JavaConversions.enumerationAsScalaIterator<A>(this)
28+
29+
/**
30+
* @see JavaConversions.iterableAsScalaIterable for more information.
31+
*/
32+
fun <A> Iterable<A>.asScalaIterable(): ScalaIterable<A> = JavaConversions.iterableAsScalaIterable<A>(this)
33+
34+
/**
35+
* @see JavaConversions.collectionAsScalaIterable for more information.
36+
*/
37+
fun <A> Collection<A>.asScalaIterable(): ScalaIterable<A> = JavaConversions.collectionAsScalaIterable<A>(this)
38+
39+
/**
40+
* @see JavaConversions.asScalaBuffer for more information.
41+
*/
42+
fun <A> MutableList<A>.asScalaMutableBuffer(): ScalaMutableBuffer<A> = JavaConversions.asScalaBuffer<A>(this)
43+
44+
/**
45+
* @see JavaConversions.asScalaSet for more information.
46+
*/
47+
fun <A> MutableSet<A>.asScalaMutableSet(): ScalaMutableSet<A> = JavaConversions.asScalaSet<A>(this)
48+
49+
/**
50+
* @see JavaConversions.mapAsScalaMap for more information.
51+
*/
52+
fun <A, B> MutableMap<A, B>.asScalaMutableMap(): ScalaMutableMap<A, B> = JavaConversions.mapAsScalaMap<A, B>(this)
53+
54+
/**
55+
* @see JavaConversions.dictionaryAsScalaMap for more information.
56+
*/
57+
fun <A, B> Map<A, B>.asScalaMap(): ScalaMap<A, B> = JavaConversions.mapAsScalaMap<A, B>(this)
58+
59+
/**
60+
* @see JavaConversions.mapAsScalaConcurrentMap for more information.
61+
*/
62+
fun <A, B> ConcurrentMap<A, B>.asScalaConcurrentMap(): ScalaConcurrentMap<A, B> = JavaConversions.mapAsScalaConcurrentMap<A, B>(this)
63+
64+
/**
65+
* @see JavaConversions.dictionaryAsScalaMap for more information.
66+
*/
67+
fun <A, B> Dictionary<A, B>.asScalaMap(): ScalaMutableMap<A, B> = JavaConversions.dictionaryAsScalaMap<A, B>(this)
68+
69+
/**
70+
* @see JavaConversions.propertiesAsScalaMap for more information.
71+
*/
72+
fun Properties.asScalaMap(): ScalaMutableMap<String, String> = JavaConversions.propertiesAsScalaMap(this)
73+
74+
75+
/**
76+
* @see JavaConversions.asJavaIterator for more information.
77+
*/
78+
fun <A> ScalaIterator<A>.asKotlinIterator(): Iterator<A> = JavaConversions.asJavaIterator<A>(this)
79+
80+
/**
81+
* @see JavaConversions.asJavaEnumeration for more information.
82+
*/
83+
fun <A> ScalaIterator<A>.asKotlinEnumeration(): Enumeration<A> = JavaConversions.asJavaEnumeration<A>(this)
84+
85+
/**
86+
* @see JavaConversions.asJavaIterable for more information.
87+
*/
88+
fun <A> ScalaIterable<A>.asKotlinIterable(): Iterable<A> = JavaConversions.asJavaIterable<A>(this)
89+
90+
/**
91+
* @see JavaConversions.asJavaCollection for more information.
92+
*/
93+
fun <A> ScalaIterable<A>.asKotlinCollection(): Collection<A> = JavaConversions.asJavaCollection<A>(this)
94+
95+
/**
96+
* @see JavaConversions.bufferAsJavaList for more information.
97+
*/
98+
fun <A> ScalaMutableBuffer<A>.asKotlinMutableList(): MutableList<A> = JavaConversions.bufferAsJavaList<A>(this)
99+
100+
/**
101+
* @see JavaConversions.mutableSeqAsJavaList for more information.
102+
*/
103+
fun <A> ScalaMutableSeq<A>.asKotlinMutableList(): MutableList<A> = JavaConversions.mutableSeqAsJavaList<A>(this)
104+
105+
/**
106+
* @see JavaConversions.seqAsJavaList for more information.
107+
*/
108+
fun <A> ScalaSeq<A>.asKotlinList(): List<A> = JavaConversions.seqAsJavaList<A>(this)
109+
110+
/**
111+
* @see JavaConversions.mutableSetAsJavaSet for more information.
112+
*/
113+
fun <A> ScalaMutableSet<A>.asKotlinMutableSet(): MutableSet<A> = JavaConversions.mutableSetAsJavaSet<A>(this)
114+
115+
/**
116+
* @see JavaConversions.setAsJavaSet for more information.
117+
*/
118+
fun <A> ScalaSet<A>.asKotlinSet(): Set<A> = JavaConversions.setAsJavaSet<A>(this)
119+
120+
/**
121+
* @see JavaConversions.mutableMapAsJavaMap for more information.
122+
*/
123+
fun <A, B> ScalaMutableMap<A, B>.asKotlinMutableMap(): MutableMap<A, B> = JavaConversions.mutableMapAsJavaMap<A, B>(this)
124+
125+
/**
126+
* @see JavaConversions.asJavaDictionary for more information.
127+
*/
128+
fun <A, B> ScalaMutableMap<A, B>.asKotlinDictionary(): Dictionary<A, B> = JavaConversions.asJavaDictionary<A, B>(this)
129+
130+
/**
131+
* @see JavaConversions.mapAsJavaMap for more information.
132+
*/
133+
fun <A, B> ScalaMap<A, B>.asKotlinMap(): Map<A, B> = JavaConversions.mapAsJavaMap<A, B>(this)
134+
135+
/**
136+
* @see JavaConversions.mapAsJavaConcurrentMap for more information.
137+
*/
138+
fun <A, B> ScalaConcurrentMap<A, B>.asKotlinConcurrentMap(): ConcurrentMap<A, B> = JavaConversions.mapAsJavaConcurrentMap<A, B>(this)
139+

kotlin-spark-api/2.4/src/test/kotlin/org/jetbrains/kotlinx/spark/api/ApiTest.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,16 @@ import ch.tutteli.atrium.api.fluent.en_GB.*
2121
import ch.tutteli.atrium.domain.builders.migration.asExpect
2222
import ch.tutteli.atrium.verbs.expect
2323
import io.kotest.core.spec.style.ShouldSpec
24+
import io.kotest.matchers.shouldBe
25+
import scala.collection.Seq
2426
import org.apache.spark.sql.Dataset
2527
import java.io.Serializable
2628
import java.sql.Date
2729
import java.sql.Timestamp
2830
import java.time.LocalDate
31+
import scala.collection.Iterator as ScalaIterator
32+
import scala.collection.Map as ScalaMap
33+
import scala.collection.mutable.Map as ScalaMutableMap
2934

3035
class ApiTest : ShouldSpec({
3136
context("integration tests") {
@@ -159,6 +164,41 @@ class ApiTest : ShouldSpec({
159164

160165
expect(result).asExpect().contains.inOrder.only.values(3, 5, 7, 9, 11)
161166
}
167+
should("Handle JavaConversions in Kotlin") {
168+
// Test the iterator conversion
169+
val scalaIterator: ScalaIterator<String> = listOf("test1", "test2").iterator().asScalaIterator()
170+
scalaIterator.next() shouldBe "test1"
171+
172+
val kotlinIterator: Iterator<String> = scalaIterator.asKotlinIterator()
173+
kotlinIterator.next() shouldBe "test2"
174+
175+
176+
val scalaMap: ScalaMap<Int, String> = mapOf(1 to "a", 2 to "b").asScalaMap()
177+
scalaMap.get(1).get() shouldBe "a"
178+
scalaMap.get(2).get() shouldBe "b"
179+
180+
val kotlinMap: Map<Int, String> = scalaMap.asKotlinMap()
181+
kotlinMap[1] shouldBe "a"
182+
kotlinMap[2] shouldBe "b"
183+
184+
185+
val scalaMutableMap: ScalaMutableMap<Int, String> = mutableMapOf(1 to "a").asScalaMutableMap()
186+
scalaMutableMap.get(1).get() shouldBe "a"
187+
188+
scalaMutableMap.put(2, "b")
189+
190+
val kotlinMutableMap: MutableMap<Int, String> = scalaMutableMap.asKotlinMutableMap()
191+
kotlinMutableMap[1] shouldBe "a"
192+
kotlinMutableMap[2] shouldBe "b"
193+
194+
val scalaSeq: Seq<String> = listOf("a", "b").iterator().asScalaIterator().toSeq()
195+
scalaSeq.take(1).toList().last() shouldBe "a"
196+
scalaSeq.take(2).toList().last() shouldBe "b"
197+
198+
val kotlinList: List<String> = scalaSeq.asKotlinList()
199+
kotlinList.first() shouldBe "a"
200+
kotlinList.last() shouldBe "b"
201+
}
162202
should("be able to serialize Date 2.4") { // uses knownDataTypes
163203
val dataset: Dataset<Pair<Date, Int>> = dsOf(Date.valueOf("2020-02-10") to 5)
164204
dataset.show()
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
@file:Suppress("NOTHING_TO_INLINE", "RemoveExplicitTypeArguments")
2+
3+
package org.jetbrains.kotlinx.spark.api
4+
5+
import scala.collection.JavaConverters
6+
import java.util.*
7+
import java.util.concurrent.ConcurrentMap
8+
import scala.collection.Iterable as ScalaIterable
9+
import scala.collection.Iterator as ScalaIterator
10+
import scala.collection.Map as ScalaMap
11+
import scala.collection.Seq as ScalaSeq
12+
import scala.collection.Set as ScalaSet
13+
import scala.collection.concurrent.Map as ScalaConcurrentMap
14+
import scala.collection.mutable.Buffer as ScalaMutableBuffer
15+
import scala.collection.mutable.Map as ScalaMutableMap
16+
import scala.collection.mutable.Seq as ScalaMutableSeq
17+
import scala.collection.mutable.Set as ScalaMutableSet
18+
19+
/**
20+
* @see JavaConverters.asScalaIterator for more information.
21+
*/
22+
fun <A> Iterator<A>.asScalaIterator(): ScalaIterator<A> = JavaConverters.asScalaIterator<A>(this)
23+
24+
/**
25+
* @see JavaConverters.enumerationAsScalaIterator for more information.
26+
*/
27+
fun <A> Enumeration<A>.asScalaIterator(): ScalaIterator<A> = JavaConverters.enumerationAsScalaIterator<A>(this)
28+
29+
/**
30+
* @see JavaConverters.iterableAsScalaIterable for more information.
31+
*/
32+
fun <A> Iterable<A>.asScalaIterable(): ScalaIterable<A> = JavaConverters.iterableAsScalaIterable<A>(this)
33+
34+
/**
35+
* @see JavaConverters.collectionAsScalaIterable for more information.
36+
*/
37+
fun <A> Collection<A>.asScalaIterable(): ScalaIterable<A> = JavaConverters.collectionAsScalaIterable<A>(this)
38+
39+
/**
40+
* @see JavaConverters.asScalaBuffer for more information.
41+
*/
42+
fun <A> MutableList<A>.asScalaMutableBuffer(): ScalaMutableBuffer<A> = JavaConverters.asScalaBuffer<A>(this)
43+
44+
/**
45+
* @see JavaConverters.asScalaSet for more information.
46+
*/
47+
fun <A> MutableSet<A>.asScalaMutableSet(): ScalaMutableSet<A> = JavaConverters.asScalaSet<A>(this)
48+
49+
/**
50+
* @see JavaConverters.mapAsScalaMap for more information.
51+
*/
52+
fun <A, B> MutableMap<A, B>.asScalaMutableMap(): ScalaMutableMap<A, B> = JavaConverters.mapAsScalaMap<A, B>(this)
53+
54+
/**
55+
* @see JavaConverters.dictionaryAsScalaMap for more information.
56+
*/
57+
fun <A, B> Map<A, B>.asScalaMap(): ScalaMap<A, B> = JavaConverters.mapAsScalaMap<A, B>(this)
58+
59+
/**
60+
* @see JavaConverters.mapAsScalaConcurrentMap for more information.
61+
*/
62+
fun <A, B> ConcurrentMap<A, B>.asScalaConcurrentMap(): ScalaConcurrentMap<A, B> = JavaConverters.mapAsScalaConcurrentMap<A, B>(this)
63+
64+
/**
65+
* @see JavaConverters.dictionaryAsScalaMap for more information.
66+
*/
67+
fun <A, B> Dictionary<A, B>.asScalaMap(): ScalaMutableMap<A, B> = JavaConverters.dictionaryAsScalaMap<A, B>(this)
68+
69+
/**
70+
* @see JavaConverters.propertiesAsScalaMap for more information.
71+
*/
72+
fun Properties.asScalaMap(): ScalaMutableMap<String, String> = JavaConverters.propertiesAsScalaMap(this)
73+
74+
75+
/**
76+
* @see JavaConverters.asJavaIterator for more information.
77+
*/
78+
fun <A> ScalaIterator<A>.asKotlinIterator(): Iterator<A> = JavaConverters.asJavaIterator<A>(this)
79+
80+
/**
81+
* @see JavaConverters.asJavaEnumeration for more information.
82+
*/
83+
fun <A> ScalaIterator<A>.asKotlinEnumeration(): Enumeration<A> = JavaConverters.asJavaEnumeration<A>(this)
84+
85+
/**
86+
* @see JavaConverters.asJavaIterable for more information.
87+
*/
88+
fun <A> ScalaIterable<A>.asKotlinIterable(): Iterable<A> = JavaConverters.asJavaIterable<A>(this)
89+
90+
/**
91+
* @see JavaConverters.asJavaCollection for more information.
92+
*/
93+
fun <A> ScalaIterable<A>.asKotlinCollection(): Collection<A> = JavaConverters.asJavaCollection<A>(this)
94+
95+
/**
96+
* @see JavaConverters.bufferAsJavaList for more information.
97+
*/
98+
fun <A> ScalaMutableBuffer<A>.asKotlinMutableList(): MutableList<A> = JavaConverters.bufferAsJavaList<A>(this)
99+
100+
/**
101+
* @see JavaConverters.mutableSeqAsJavaList for more information.
102+
*/
103+
fun <A> ScalaMutableSeq<A>.asKotlinMutableList(): MutableList<A> = JavaConverters.mutableSeqAsJavaList<A>(this)
104+
105+
/**
106+
* @see JavaConverters.seqAsJavaList for more information.
107+
*/
108+
fun <A> ScalaSeq<A>.asKotlinList(): List<A> = JavaConverters.seqAsJavaList<A>(this)
109+
110+
/**
111+
* @see JavaConverters.mutableSetAsJavaSet for more information.
112+
*/
113+
fun <A> ScalaMutableSet<A>.asKotlinMutableSet(): MutableSet<A> = JavaConverters.mutableSetAsJavaSet<A>(this)
114+
115+
/**
116+
* @see JavaConverters.setAsJavaSet for more information.
117+
*/
118+
fun <A> ScalaSet<A>.asKotlinSet(): Set<A> = JavaConverters.setAsJavaSet<A>(this)
119+
120+
/**
121+
* @see JavaConverters.mutableMapAsJavaMap for more information.
122+
*/
123+
fun <A, B> ScalaMutableMap<A, B>.asKotlinMutableMap(): MutableMap<A, B> = JavaConverters.mutableMapAsJavaMap<A, B>(this)
124+
125+
/**
126+
* @see JavaConverters.asJavaDictionary for more information.
127+
*/
128+
fun <A, B> ScalaMutableMap<A, B>.asKotlinDictionary(): Dictionary<A, B> = JavaConverters.asJavaDictionary<A, B>(this)
129+
130+
/**
131+
* @see JavaConverters.mapAsJavaMap for more information.
132+
*/
133+
fun <A, B> ScalaMap<A, B>.asKotlinMap(): Map<A, B> = JavaConverters.mapAsJavaMap<A, B>(this)
134+
135+
/**
136+
* @see JavaConverters.mapAsJavaConcurrentMap for more information.
137+
*/
138+
fun <A, B> ScalaConcurrentMap<A, B>.asKotlinConcurrentMap(): ConcurrentMap<A, B> = JavaConverters.mapAsJavaConcurrentMap<A, B>(this)
139+

kotlin-spark-api/3.0/src/test/kotlin/org/jetbrains/kotlinx/spark/api/ApiTest.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,17 @@ import ch.tutteli.atrium.api.fluent.en_GB.*
2121
import ch.tutteli.atrium.domain.builders.migration.asExpect
2222
import ch.tutteli.atrium.verbs.expect
2323
import io.kotest.core.spec.style.ShouldSpec
24+
import io.kotest.matchers.shouldBe
25+
import scala.collection.Seq
2426
import org.apache.spark.sql.Dataset
2527
import java.io.Serializable
2628
import java.sql.Date
2729
import java.sql.Timestamp
2830
import java.time.Instant
2931
import java.time.LocalDate
32+
import scala.collection.Iterator as ScalaIterator
33+
import scala.collection.Map as ScalaMap
34+
import scala.collection.mutable.Map as ScalaMutableMap
3035

3136
class ApiTest : ShouldSpec({
3237
context("integration tests") {
@@ -173,6 +178,41 @@ class ApiTest : ShouldSpec({
173178

174179
expect(result).asExpect().contains.inOrder.only.values(3, 5, 7, 9, 11)
175180
}
181+
should("Handle JavaConversions in Kotlin") {
182+
// Test the iterator conversion
183+
val scalaIterator: ScalaIterator<String> = listOf("test1", "test2").iterator().asScalaIterator()
184+
scalaIterator.next() shouldBe "test1"
185+
186+
val kotlinIterator: Iterator<String> = scalaIterator.asKotlinIterator()
187+
kotlinIterator.next() shouldBe "test2"
188+
189+
190+
val scalaMap: ScalaMap<Int, String> = mapOf(1 to "a", 2 to "b").asScalaMap()
191+
scalaMap.get(1).get() shouldBe "a"
192+
scalaMap.get(2).get() shouldBe "b"
193+
194+
val kotlinMap: Map<Int, String> = scalaMap.asKotlinMap()
195+
kotlinMap[1] shouldBe "a"
196+
kotlinMap[2] shouldBe "b"
197+
198+
199+
val scalaMutableMap: ScalaMutableMap<Int, String> = mutableMapOf(1 to "a").asScalaMutableMap()
200+
scalaMutableMap.get(1).get() shouldBe "a"
201+
202+
scalaMutableMap.put(2, "b")
203+
204+
val kotlinMutableMap: MutableMap<Int, String> = scalaMutableMap.asKotlinMutableMap()
205+
kotlinMutableMap[1] shouldBe "a"
206+
kotlinMutableMap[2] shouldBe "b"
207+
208+
val scalaSeq: Seq<String> = listOf("a", "b").iterator().asScalaIterator().toSeq()
209+
scalaSeq.take(1).toList().last() shouldBe "a"
210+
scalaSeq.take(2).toList().last() shouldBe "b"
211+
212+
val kotlinList: List<String> = scalaSeq.asKotlinList()
213+
kotlinList.first() shouldBe "a"
214+
kotlinList.last() shouldBe "b"
215+
}
176216
should("handle LocalDate Datasets") { // uses encoder
177217
val dataset: Dataset<LocalDate> = dsOf(LocalDate.now(), LocalDate.now())
178218
dataset.show()

0 commit comments

Comments
 (0)