【发布时间】:2010-06-11 18:31:31
【问题描述】:
有熟悉 Scala 的人知道我如何在 Java 中使用 scala.collection.immutable.Set 吗?我可以模糊地阅读 scaladoc,但不确定如何从 java 调用诸如“-”之类的 scala 方法(我假设我只需要在我的类路径中包含一些 scala .jar 文件......?)
【问题讨论】:
标签: java data-structures scala
有熟悉 Scala 的人知道我如何在 Java 中使用 scala.collection.immutable.Set 吗?我可以模糊地阅读 scaladoc,但不确定如何从 java 调用诸如“-”之类的 scala 方法(我假设我只需要在我的类路径中包含一些 scala .jar 文件......?)
【问题讨论】:
标签: java data-structures scala
Scala 将这些特殊符号写成 $plus、$minus 等。您可以通过针对 scala.collection.immutable.HashSet 运行 javap 来亲眼看到这一点。
这允许你做这样的代码:
Set s = new HashSet<String>();
s.$plus("one");
不漂亮,它实际上在运行时不起作用!你得到一个 NoSuchMethodError。我猜它与this discussion 有关。使用他们讨论的解决方法,您可以让事情正常进行:
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<String>();
s = (Set<String>) ((Addable) s).$plus("GAH!");
s = (Set<String>) ((Addable) s).$plus("YIKES!");
s = (Set<String>) ((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<String>)new Set.Set1<String>("better")
Set mySet = (Set<String>)new Set.Set2<String>("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<String>();
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<String>();
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!)
【讨论】: