2017-07-31 4 views
1

Je souhaite donner une fonction python en tant que consommateur pour une méthode java.Fonction Jython vers Java Consommateur

public Class MyObject { 
    public void javaFunction(Consumer<Double> consumer){...} 
} 

et

def python_function(arg): 
    some_code_using(arg) 

J'ai essayé les éléments suivants:

myObjectInstance.javaFunction(python_function) 

et

myObjectInstance.javaFunction(lambda arg: python_function(arg)) 

A chaque fois, je reçois 1er arg ne peut être contraint à java .util.function.Consumer

Je l'ai déjà fait avec des fournisseurs et cela a bien fonctionné. J'utilise org.python.util.PythonInterpreter

Des idées sur la façon de passer un tel consommateur?

Répondre

0

Après des conseils de this answer par @suvy on pourrait créer un ensemble d'aide classées comme si

from java.util.Arrays import asList 
from java.util.function import Predicate, Consumer, Function 
from java.util.stream import Collectors 

class jc(Consumer): 
    def __init__(self, fn): 
     self.accept=fn 

class jf(Function): 
    def __init__(self, fn): 
     self.apply = fn 

class jp(Predicate): 
    def __init__(self, fn): 
     self.test = fn 

qui pourrait ensuite être utilisé comme si

>>> def p(x): 
...  print(x) 
... 
>>> asList("one", "two", "three").stream().filter(jp(lambda x: len(x)>3)).map(jf(lambda x: "a"+x)).forEach(jc(lambda x: p("foo"+x))).collect(Collectors.toList()) 
fooathree 

ou en utilisant intégré Collectors classe, si vous besoin de collecte comme résultat

>>> asList("one", "two", "three").stream().filter(jp(lambda x: len(x)>3)).map(jf(lambda x: "a"+x)).collect(Collectors.toList()) 
[athree]