gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:16:01 38 4
gpt4 key购买 nike

我是 scala 新手,我需要编写一个 java 代码,将 scala.collection.immutable.List 数组传递给 scala 函数。更具体地说,我在 java 代码中使用了一个 scala 函数,它需要 scala.collection.immutable.List<Tuple2<Object, Object>>[] 作为参数。 。对象需要是 <Integer, Double> 。在 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 转换为 scala 或创建 scala.collection.immutable.List<Tuple2<Object, Object>>[]并直接在我的java代码中使用它,但我很难找到它。我在 Maven 项目中使用 Java 8、scala 2.12.2。

最佳答案

我不知道我刚刚犯了什么令人厌恶的罪行,但是:

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

然后

$ 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);
}

与 Scala 2.13 的互操作:

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

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

关于java - 如何在java代码中使用scala.collection.immutable.List数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416221/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com