2

我正在尝试在 jython 中使用 java 8 流和集合,以查看它们在纯 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()))

打印 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。具体来说,如何在 jython 中编写像 string -> sting.isEmpty() 这样的 java lambda 表达式?

4

1 回答 1

2

这是在流上使用过滤器的示例,需要 Predicate 类型的对象 (java.util.function.Predicate)

对于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 将首先对 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

第一:

[abc, bc, efg, abcd, jkl]
于 2017-05-23T15:25:46.880 回答