【问题标题】:example of using scala.collection.immutable.Set from java从 java 中使用 scala.collection.immutable.Set 的示例
【发布时间】:2010-06-11 18:31:31
【问题描述】:

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

【问题讨论】:

    标签: java data-structures scala


    【解决方案1】:

    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。

    【讨论】:

    • 不幸的是,Java 7 调用外来名称 (bugs.sun.com/view_bug.do?bug_id=6746458) 的语法并不漂亮:s = s.#"-"('GAH!')
    • 我没有使用 Scala 2.8.0(它具有所有可添加/可减去的东西)并且不需要使用转换......对我来说关键是命名(例如“$ plus" 和 "$minus") 以及 scala-library.jar -- 谢谢!
    【解决方案2】:

    如果它仅用于初始化一组少于 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);
    

    【讨论】:

      【解决方案3】:

      根据 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!)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多