2017-05-15 134 views
0

我正在嘗試使用jython中的java 8個流和集合進行實驗,以查看它們在純jython中實現時是否有效。我突然想起它可以如何在Jython中使用Java 8 lambdas

我開始用一些例子(任何在此也感謝評論),計數

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作爲字典 {u'a「:2L,u'b」 :1L,u'c':1L}

到目前爲止這麼好。接下來,我找到了一個在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(); 

這將如何轉換爲jython。具體如何可以寫一個java lambda表達式,如jython中的string - > sting.isEmpty()?

+1

創建'Predicate'對象並將其傳遞給'Stream.filter'。箭頭語法只是語法糖。在幕後,你正在定義一個具有參數的'Predicate'對象並返回一個'boolean'結果。 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#filter-java.util.function.Predicate- – IceArdor

+0

@iceArdor謝謝,用它來回答這個問題 – suvy

回答

0

這裏是用於使用流上的一個過濾器的示例需要Java代碼類型謂詞的對象(java.util.function.Predicate)

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將首先繼承Predicate並實現一個測試方法。

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) 

然後打印

計數:

5L 

LST:

[abc, bc, efg, abcd, jkl]