2017-05-15 11 views
0

jythonでJava 8ストリームとコレクションを試して、純粋なjythonで実装されたときに効率的かどうかを確認しようとしています。 「:2L、u'b」カウントJava 8 lambdasをJythonで使用する方法

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())) 
辞書 {u'aとして

印刷CNT、私はいくつかの例で開始

(この上の任意のコメントにも感謝)それは可能性が私に起こります: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に変換されますか?特にどのようにjythonでstring - > sting.isEmpty()のような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のは、になるであろう。ここで

+1

は 'Predicate'オブジェクトを作成し、Stream.filter''にそれを渡します。矢印の構文は単なる構文的な砂糖です。その背後では、引数を持ち、 'ブール値'の結果を返す 'Predicate'オブジェクトを定義しています。 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)

のオブジェクトが必要です最初に述語をサブクラス化し、テストメソッドを実装します。

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] 
関連する問題