[英]passing parameters from constructor to functions in processing/java
[英]Using Scala from Java: passing functions as parameters
考慮以下 Scala 代碼:
package scala_java
object MyScala {
def setFunc(func: Int => String) {
func(10)
}
}
現在在 Java 中,我希望將MyScala
用作:
package scala_java;
public class MyJava {
public static void main(String [] args) {
MyScala.setFunc(myFunc); // This line gives an error
}
public static String myFunc(int someInt) {
return String.valueOf(someInt);
}
}
但是,上述方法不起作用(正如預期的那樣,因為 Java 不允許函數式編程)。 在 Java 中傳遞 function 的最簡單解決方法是什么? 我想要一個適用於具有任意數量參數的函數的通用解決方案。
編輯: Java 8 的語法是否比下面討論的經典解決方案更好?
在scala.runtime
package 中,有抽象類,名為AbstractFunction1
等,用於其他 arities。 要從 Java 使用它們,您只需覆蓋apply
,如下所示:
Function1<Integer, String> f = new AbstractFunction1<Integer, String>() {
public String apply(Integer someInt) {
return myFunc(someInt);
}
};
If you're on Java 8 and want to use Java 8 lambda syntax for this, check out https://github.com/scala/scala-java8-compat .
您必須手動實例化 Java 中的Function1
。 就像是:
final Function1<Integer, String> f = new Function1<Integer, String>() {
public int $tag() {
return Function1$class.$tag(this);
}
public <A> Function1<A, String> compose(Function1<A, Integer> f) {
return Function1$class.compose(this, f);
}
public String apply(Integer someInt) {
return myFunc(someInt);
}
};
MyScala.setFunc(f);
對我來說最簡單的方法是定義一個java接口,如:
public interface JFunction<A,B> {
public B compute( A a );
}
然后修改您的 scala 代碼,重載setFunc
以接受JFunction
對象,例如:
object MyScala {
// API for scala
def setFunc(func: Int => String) {
func(10)
}
// API for java
def setFunc(jFunc: JFunction[Int,String]) {
setFunc( (i:Int) => jFunc.compute(i) )
}
}
您自然會使用 scala 中的第一個定義,但仍然可以使用 java 中的第二個定義:
public class MyJava {
public static void main(String [] args) {
MyScala.setFunc(myFunc); // This line gives an error
}
public static final JFunction<Integer,String> myFunc =
new JFunction<Integer,String>() {
public String compute( Integer a ) {
return String.valueOf(a);
}
};
}
這是我對解決方案的嘗試,一個小庫: https://github.com/eirslett/sc8
您將 Java 8 lambda 包裝在 F(...) 中,然后將其轉換為 Scala ZC1C5D145268E7CA83。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.