从java使用scala.collection.immutable.Set的示例

那些熟悉Scala的人是否知道如何使用Java中的scala.collection.immutable.Set ? 我可以模糊地阅读scaladoc,但我不确定如何从java调用scala方法如“ – ”(我假设我只需要在我的类路径中包含一些scala .jar文件……?)

Scala将这些特殊符号写为$ plus,$ minus等。您可以通过对scala.collection.immutable.HashSet运行javap来自行查看。

这允许你做这样的代码:

Set s = new HashSet(); s.$plus("one"); 

不漂亮,它实际上并没有在运行时工作! 你得到一个NoSuchMethodError。 我猜它与这个讨论有关 。 使用他们讨论的解决方法,您可以使工作正常:

 import scala.collection.generic.Addable; import scala.collection.generic.Subtractable; import scala.collection.immutable.HashSet; import scala.collection.immutable.Set; public class Test { public static void main(String[] args) { Set s = new HashSet(); s = (Set) ((Addable) s).$plus("GAH!"); s = (Set) ((Addable) s).$plus("YIKES!"); s = (Set) ((Subtractable) s).$minus("GAH!"); System.out.println(s); // prints Set(YIKES!) } } 

这不是一个美女!?

我相信Java 7将允许转义时髦的方法名称,所以也许到那时你就可以做到

 s = s.#"-"('GAH!') 

要尝试此操作,您需要Scala发行版的lib /文件夹中的scala-library.jar。

更新 :修复了Java 7语法,感谢Mirko。

你可以使用它,如果它只用于初始化一套少于5项

 import scala.collection.immutable.Set; Set mySet = (Set)new Set.Set1("better") Set mySet = (Set)new Set.Set2("better","andmore") 

另一种方法如下:

 import scala.collection.JavaConversions$; import scala.collection.immutable.Set; import scala.collection.immutable.Set$; //code java.util.HashSet hashsSet = new java.util.HashSet(); hashsSet.add("item1"); hashsSet.add("item2"); hashsSet.add("item3"); hashsSet.add("item4"); hashsSet.add("item5"); // this is the mutable set of scala scala.collection.mutable.Set scalaSet = JavaConversions$.MODULE$.asScalaSet(hashsSet); //this is immutable set Set immutable = scalaSet.toSet(); System.out.println(immutable); 

根据Adam的回答,以下在Eclipse下使用Scala 2.7.7可以正常工作:

 package com.example.test.scala; import scala.collection.immutable.HashSet; import scala.collection.immutable.Set; public class ImmutableSetTest1 { public static void main(String[] args) { Set s0 = new HashSet(); Set[] s = new Set[3]; s[0] = s0.$plus("GAH!"); s[1] = s[0].$plus("YIKES!"); s[2] = s[1].$minus("GAH!"); for (int i = 0; i < 3; ++i) System.out.println("s["+i+"]="+s[i]); } } 

打印:

 s[0]=Set(GAH!) s[1]=Set(GAH!, YIKES!) s[2]=Set(YIKES!)