Có ai ngoài kia quen thuộc với Scala biết cách tôi có thể sử dụng scala.collection.immutable.Set từ Java không? Tôi có thể mơ hồ đọc các scaladoc, nhưng tôi không chắc chắn làm thế nào để gọi các phương pháp scala như "-" từ java (Tôi giả sử rằng tôi chỉ cần bao gồm một số tập tin scala .jar trong classpath của tôi ...?)ví dụ về việc sử dụng scala.collection.immutable.Set từ java
Trả lời
Scala viết những biểu tượng đặc biệt đó như $ plus, $ minus, etc. Bạn có thể thấy điều đó cho chính mình bằng cách chạy javap với scala.collection.immutable.HashSet.
đó cho phép bạn để làm mã như thế này:
Set s = new HashSet<String>();
s.$plus("one");
Không xinh đẹp, và nó không thực sự làm việc trong thời gian chạy! Bạn nhận được một NoSuchMethodError. Tôi đoán nó liên quan đến this discussion. Sử dụng cách giải quyết mà họ thảo luận, bạn có thể làm việc:
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!)
}
}
Đó không phải là một vẻ đẹp sao !?
Tôi tin rằng Java 7 sẽ cho phép tên phương pháp funky để được thoát, như vậy có lẽ bởi sau đó bạn sẽ có thể làm
s = s.#"-"('GAH!')
Để thử này, bạn cần scala-library.jar từ lib/thư mục của phân phối Scala.
Cập nhật: cú pháp Java 7 cố định, cảm ơn Mirko.
Dựa trên câu trả lời của Adam, sau hoạt động tốt đối với tôi với Scala 2.7.7 dưới Eclipse:
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]);
}
}
mà in:
s[0]=Set(GAH!)
s[1]=Set(GAH!, YIKES!)
s[2]=Set(YIKES!)
bạn có thể sử dụng điều này nếu nó chỉ cho init một Bộ ít hơn 5 món hàng
import scala.collection.immutable.Set;
Set mySet = (Set<String>)new Set.Set1<String>("better")
Set mySet = (Set<String>)new Set.Set2<String>("better","andmore")
Khác Cách để làm điều đó như sau:
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);
Thật không may, cú pháp Java 7 để gọi tên kỳ lạ (http://bugs.sun.com/view_bug.do?bug_id=6746458) mà không phải là đẹp: s = s. # "-" ('GAH!') –
Tôi không sử dụng Scala 2.8.0 (trong đó có tất cả những gì có thể thêm/Subtractable) và không cần phải sử dụng đúc ... chìa khóa cho tôi là việc đặt tên (ví dụ "$ plus" và "$ minus") và scala-library.jar - cảm ơn! –