/ / Гладкий спосіб використання функції <A, R> java інтерфейс від scala? - java, scala, функціонально-програмування, interop

Гладкий спосіб використання функції <A, R> інтерфейсу Java від scala? - java, scala, функціональне програмування, interop

Тут на роботі більшість людей користуються Java, поки я єробота з Scala. Ми вирішили зібрати деякі загальні класи у бібліотеці, яка буде написана на Java. Тепер я хочу додати до бібліотеки деяке псевдо-функціональне програмування.

java:

public interface Func<A, R> {
public R f(a A);
}

public AClass {
public <R> ArrayList<R> myMethod(
Func<String, R> func
) {
// ...
}
}

використання в java:

AClass ac = new AClass();
ArrayList<String> al = ac.myMethod(
new Func<String, String> (
public String f(String s) {
return s + "!";
}
})

Вищезгадане не зовсім виходить (більше схоже на складнощі насправді, з точки зору scala). Чи є спосіб викликати магію scala, щоб мати змогу зробити щось подібне до scala:

var ac = new ACLass
var al = ac.myMethod(str => str + "!")             // alternative 1
al = ac.myMethod { case: str:String => str + "!" } // alternative 2

Я зіпсувався навколо з наслідками на деякий час, але не міг "отримати речі відібрані = P.

Відповіді:

14 за відповідь № 1

З неявними перетвореннями:

object FuncConversions {
implicit def func2function[A,R]( fn: (A) => R ) =
new Func[A,R] {
def f(a: A) = fn(a)
}
}

Не забудьте імпортувати конверсію в області:

import FuncConversions._

Також можна здійснити протилежне перетворення.


6 для відповіді № 2

Розширити на парадигматичну відповідь. Ось як ви йдете про з'ясування неявної. Невірні перетворення вступають у гру, коли типи не перевіряються. Коли це станеться, компілятор шукатиме неявне перетворення, щоб використовувати так, щоб типи відповідали.

Після очищення вашого прикладу, в REPL, компілятор покаже:

scala> ac.myMethod((s:String) => s + "!")
<console>:9: error: type mismatch;
found   : String => java.lang.String
required: Func[java.lang.String,?]
ac.myMethod((s:String) => s + "!")

Таким чином, компілятор повідомляє вам, що він знайшов (String) => (String) але потребує a Func[String, ?]. Тому потрібно забезпечити неявну конверсію між знайдено тип і вимагається тип. Так що підпис повинен бути щось подібне:

implicit def fun2Func(fun: (String) => String): Func[String,String]

Далі, наступний крок полягає в тому, щоб зрозуміти, що неявне перетворення може бути узагальнене до типів A і R.

На sidenote, я дивуюсь якщо ви б краще re-використовуєте щось з полиці люблять http://code.google.com/p/guava-libraries/.


3 для відповіді № 3

Я не знаю точно, але, можливо, функціональну Java http://functionaljava.org/ може допомогти вам і вашим колегам. Які функції ви намагаєтеся зібрати у вашому "псевдо-fp" lib?