Skip to content

Commit fa5ad9a

Browse files
authored
Merge pull request scala#7705 from joshlemer/jsetwrapper-filterInPlace
scala.collection.convert.JSetWrapper#filterInPlace delegates to underlying#removeIf
2 parents f1c1d62 + a72dfe9 commit fa5ad9a

File tree

3 files changed

+51
-8
lines changed

3 files changed

+51
-8
lines changed

src/library/scala/collection/convert/Wrappers.scala

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -194,26 +194,34 @@ private[collection] trait Wrappers {
194194
@SerialVersionUID(3L)
195195
case class JSetWrapper[A](underlying: ju.Set[A]) extends mutable.AbstractSet[A] with mutable.SetOps[A, mutable.Set, mutable.Set[A]] with Serializable {
196196

197-
override def size = underlying.size
197+
override def size: Int = underlying.size
198198
override def isEmpty: Boolean = underlying.isEmpty
199199
override def knownSize: Int = if (underlying.isEmpty) 0 else super.knownSize
200-
def iterator = underlying.iterator.asScala
200+
def iterator: Iterator[A] = underlying.iterator.asScala
201201

202202
def contains(elem: A): Boolean = underlying.contains(elem)
203203

204204
def addOne(elem: A): this.type = { underlying add elem; this }
205205
def subtractOne(elem: A): this.type = { underlying remove elem; this }
206206

207207
override def remove(elem: A): Boolean = underlying remove elem
208-
override def clear() = underlying.clear()
209208

210-
override def empty = JSetWrapper(new ju.HashSet[A])
209+
override def clear(): Unit = {
210+
underlying.clear()
211+
}
212+
213+
override def empty: mutable.Set[A] = JSetWrapper(new ju.HashSet[A])
214+
211215
// Note: Clone cannot just call underlying.clone because in Java, only specific collections
212216
// expose clone methods. Generically, they're protected.
213-
override def clone() =
214-
new JSetWrapper[A](new ju.LinkedHashSet[A](underlying))
217+
override def clone(): mutable.Set[A] = new JSetWrapper[A](new ju.LinkedHashSet[A](underlying))
218+
219+
override def iterableFactory: IterableFactory[mutable.Set] = mutable.HashSet
215220

216-
override def iterableFactory = mutable.HashSet
221+
override def filterInPlace(p: A => Boolean): this.type = {
222+
if (underlying.size() > 0) underlying.removeIf(!p(_))
223+
this
224+
}
217225
}
218226

219227
@SerialVersionUID(3L)

test/junit/scala/collection/convert/JSetWrapperTest.scala

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package scala.collection.convert
22

33
import java.{util => ju}
44

5-
import org.junit.Assert.assertTrue
5+
import org.junit.Assert._
66
import org.junit.Test
77
import org.junit.runner.RunWith
88
import org.junit.runners.JUnit4
@@ -20,4 +20,15 @@ class JSetWrapperTest {
2020
assertTrue(sSet.isInstanceOf[Wrappers.JSetWrapper[_]])
2121
assertTrue(sSet.iterator.sameElements(Set(1, 2, 3)))
2222
}
23+
24+
@Test
25+
def testFilterInPlace(): Unit = {
26+
val jSet: ju.Set[Int] = new ju.HashSet(ju.Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
27+
val sSet: collection.mutable.Set[Int] = jSet.asScala
28+
29+
sSet.filterInPlace(_ % 2 == 0)
30+
31+
assertEquals(sSet, Set(2, 4, 6, 8, 10))
32+
}
33+
2334
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
package scala.collection.convert
3+
4+
import org.scalacheck.{Properties, Test}
5+
import org.scalacheck.Prop._
6+
7+
import scala.collection.immutable
8+
9+
10+
object WrapperProperties extends Properties("Wrappers") {
11+
12+
override def overrideParameters(p: Test.Parameters): Test.Parameters = p.withInitialSeed(42L)
13+
14+
property("JSetWrapper#filterInPlace(p)") = forAll { (hs: immutable.HashSet[Int], p: Int => Boolean) =>
15+
val expected: collection.Set[Int] = hs.filter(p)
16+
val actual: collection.Set[Int] = {
17+
val jset = new java.util.HashSet[Int]()
18+
hs.foreach(jset.add)
19+
Wrappers.JSetWrapper(jset)
20+
}.filterInPlace(p)
21+
actual ?= expected
22+
}
23+
24+
}

0 commit comments

Comments
 (0)