Как использовать лямбды Java 8 в Jython

Я пытаюсь поэкспериментировать с потоками и коллекциями java 8 в jython, чтобы увидеть, насколько они эффективны при реализации в чистом 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. в частности, как можно написать Java-лямбда-выражения, такие как строка -> sting.isEmpty() в Jython?

1 ответ

Решение

Вот пример для использования фильтра в потоке необходим объект типа 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

LST:

[abc, bc, efg, abcd, jkl]
Другие вопросы по тегам