如何在 Java 代码中使用 scala.collection.immutable.List

2022-09-03 03:27:16

我需要编写一个代码,将Java的性能与Scala的性能进行比较。我很难让Scala在我的Java代码中工作。有人可以发布一个非常简单的“hello world”示例,说明如何在java代码(在文件中)中创建Scala并向其添加100个随机数吗?ArrayListListListList.java

PS:我非常擅长Java,但从未使用过Scala。


答案 1

从java内部使用scala.collection.JavaConversions。

例如,创建一个嵌套的 scala case 类,该类在其构造函数中需要一个 scala List:

case class CardDrawn(player: Long, card: Int) 
case class CardSet(cards: List[CardDrawn]) 

在Java中,你可以使用asScalaBuffer(x).toList(),如下所示:

import scala.collection.JavaConversions;
import java.util.ArrayList;
import java.util.List;

public CardSet buildCardSet(Set<Widget> widgets) { 

  List<CardDrawn> cardObjects = new ArrayList<>();

  for( Widget t : widgets ) {
    CardDrawn cd = new CardDrawn(t.player, t.card);
    cardObjects.add(cd);   
  }

  CardSet cs = new CardSet(JavaConversions.asScalaBuffer(cardObjects).toList());
  return cs;
}

答案 2

在Scala中使用Java集合比相反更容易,但是既然你问过:

import scala.collection.immutable.*;

public class foo {
  public List test() {
    List nil = Nil$.MODULE$; // the empty list
    $colon$colon one = $colon$colon$.MODULE$.apply((Integer) 1, nil); // 1::nil
    $colon$colon two = $colon$colon$.MODULE$.apply((Integer) 2, one); // 2::1::nil
    System.out.println(one);
    System.out.println(two);
    return two;
  }
}

这使用带有scala-library的javac进行编译.jar在类路径中:

javac -classpath /opt/local/share/scala-2.9/lib/scala-library.jar foo.java

您可以从 Scala REPL 调用:

scala> (new foo).test
List(1)
List(2, 1)
res0: List[Any] = List(2, 1)

要使用Scala的Java集合,您不必做任何特别的事情:

scala> new java.util.ArrayList[Int]
res1: java.util.ArrayList[Int] = []

scala> res1.add(1)
res2: Boolean = true

scala> res1
res3: java.util.ArrayList[Int] = [1]

推荐