Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java代码中使用scala.collection.immutable.List数组_Java_List_Scala - Fatal编程技术网

如何在java代码中使用scala.collection.immutable.List数组

如何在java代码中使用scala.collection.immutable.List数组,java,list,scala,Java,List,Scala,我是scala新手,需要编写一段java代码,将scala.collection.immutable.List数组传递给scala函数。更具体地说,我在java代码中使用了一个scala函数,它需要一个scala.collection.immutable.List[]作为参数。对象需要是。在java中,这非常简单: java.util.List<Tuple2<Integer, Double>>[] javaList = new ArrayList[335];

我是scala新手,需要编写一段java代码,将scala.collection.immutable.List数组传递给scala函数。更具体地说,我在java代码中使用了一个scala函数,它需要一个
scala.collection.immutable.List[]
作为参数。对象需要是
。在java中,这非常简单:

    java.util.List<Tuple2<Integer, Double>>[] javaList = new ArrayList[335];
            for (int i = 0; i < 335; i++) { 
                javaList[i] = new ArrayList<Tuple2<Integer, Double>>(); 
            } 
              for(int i=0; i<100;i++)
             {
                 for(int j=0; j<50;j++)
               {
                   javaList[i].add(new Tuple2<Integer, Double>(j, value(j)));
                }
             }
java.util.List[]javaList=newarraylist[335];
对于(inti=0;i<335;i++){
javaList[i]=newarraylist();
} 

对于(int i=0;i我不知道我刚才犯了什么样的可憎罪,但是:

class Target {
  @annotation.varargs
  def f(lists: List[(Int, Double)]*): Int = lists.map(_.map(_._1).sum).sum
}
然后


我没有验证这个结果;我不是完全有信心,因为它是用Java编译的。

列表数组是一种奇怪的数据结构。无论如何,Scala标准库提供了将Java集合**转换为Scala集合**的方法,反之亦然。我会用Scala编写一个函数,接收Java输入,将其转换为Scala o如果
@varargs def f(vs:List[Int]*)
,列表数组就不会那么奇怪了。我的问题是我无法更改函数中的scala参数:scala.collection.immutable.List[]因此,我需要找到一种方法从java代码中给出这种结构。@最简单的方法是添加一个新的Scala函数,该函数接收一个易于从java创建的数据结构,并进行转换。我想如果从数组开始,您可以使用
Arrays.asList(start).stream
$ javap Target
Compiled from "scalafunc.scala"
public class Target {
  public int f(scala.collection.immutable.List<scala.Tuple2<java.lang.Object, java.lang.Object>>...);
  public int f(scala.collection.immutable.Seq<scala.collection.immutable.List<scala.Tuple2<java.lang.Object, java.lang.Object>>>);
  public static final int $anonfun$f$2(scala.Tuple2);
  public static final int $anonfun$f$1(scala.collection.immutable.List);
  public Target();
  public static final java.lang.Object $anonfun$f$1$adapted(scala.collection.immutable.List);
  public static final java.lang.Object $anonfun$f$2$adapted(scala.Tuple2);
}
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import scala.Tuple2;
import static scala.jdk.javaapi.CollectionConverters.asScala;

public class j {
  public static void main(String... args) {
    // populate an array list of lists
    var javaList = new ArrayList<ArrayList<Tuple2<Integer, Double>>>();
    for (int i = 0; i < 335; i++) {
      javaList.add(new ArrayList<Tuple2<Integer, Double>>());
    }
    for(int i=0; i<100;i++) {
      for(int j=0; j<50;j++) {
        javaList.get(i).add(new Tuple2<Integer, Double>(j, Double.valueOf(j)));
      }
    }
    // convert the elements to scala lists; the result happens to be an arraylist
    var arg = (ArrayList<scala.collection.immutable.List<Tuple2<Integer, Double>>>) javaList.stream().map(vs -> asScala(vs).toList()).collect(Collectors.toList());
    // we need an array of scala lists
    @SuppressWarnings("unchecked")
    var template = (scala.collection.immutable.List<Tuple2<Object, Object>>[]) Array.newInstance(scala.collection.immutable.List.class, arg.size());
    // extract the target array
    var fargs = arg.toArray(template);
    Target t = new Target();
    // call the varargs f
    var res = t.f(fargs);
    System.out.println(res);
  }
}
$ scalac scalafunc.scala 
$ javac -Xlint -cp .:/home/me/scala-2.13.1/lib/scala-library.jar j.java && java -cp .:/home/me/scala-2.13.1/lib/scala-library.jar j
122500