2017-05-15 3 views
0

J'essaie d'expérimenter avec java 8 streams et collections en jython pour voir si elles sont efficaces puis implémentées en pure jython. Il me semble qu'il pourrait (tout commentaire sur ce aussi apprécié)Comment utiliser Java 8 lambdas en Jython

J'ai commencé avec quelques exemples, le comptage

from java.util.function import Function 
from java.util import ArrayList 
from java.util.stream import Collectors 

letters = ArrayList(['a','b','a','c']); 

cnt=letters.stream().collect(Collectors.groupingBy(Function.identity(), 
              Collectors.counting())) 

cnt d'impression dictionnaire { « GPI: 2L, u'b » : 1L, u'c ': 1L}

jusqu'ici tout va bien. Ensuite, j'ai trouvé un exemple sur l'utilisation de filtre sur les flux en Java

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 
//get count of empty string 
int count = strings.stream().filter(string -> string.isEmpty()).count(); 

comment cela se traduirait en jython. spécifiquement comment peut-on écrire expression java lambda comme chaîne -> sting.isEmpty() dans jython?

+1

Créer un objet 'Predicate' et le transmettre à' Stream.filter'. La syntaxe de la flèche est juste du sucre syntaxique. Dans les coulisses, vous définissez un objet 'Predicate' qui a un argument et retourne un résultat' boolean'. https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#filter-java.util.function.Predicate- – IceArdor

+0

@iceArdor merci, utilisé pour répondre à la question – suvy

Répondre

0

ici est un exemple pour l'utilisation d'un filtre sur un flux besoin d'un objet de type prédicats (java.util.function.Predicate)

pour le code java:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 
//get count of empty string 
int count = strings.stream().filter(string -> string.isEmpty()).count(); 

eqvivalet Jython serait Première sous-classe Prédicat et implémentation d'une méthode de test.

from java.util.function import Predicate 
from java.util.stream import Collectors 

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

@pred 
def mytest(s): 
    from java.lang import String 
    return not String(s).isEmpty() #or just use len(s.strip())==0 

strings = ArrayList(["abc", "", "bc", "efg", "abcd","", "jkl"]) 
count = strings.stream().filter(mytest).count() 
lst=strings.stream().filter(mytest).collect(Collectors.toList()) 
print(count) 
print(lst) 

imprime alors

comte:

5L 

LST:

[abc, bc, efg, abcd, jkl]