在java.util.streampython中以www.example.com方式处理序列

tsm1rwdh  于 2022-12-20  发布在  Python
关注(0)|答案(4)|浏览(84)

有人知道我如何在Python中以java流API方式编写一个序列处理吗?我的想法是按照操作发生的顺序来编写操作:

myList.stream()
    .filter(condition)
    .map(action1)
    .map(action2)
    .collect(Collectors.toList());

在python中我可以

[action2(action1(item)) for item in my_list if condition(item)]

但这是相反的顺序。
我怎么能有正确顺序的东西呢?显然我可以使用变量,但那样我就得为每个部分结果找一个名字。

vi4fp9gy

vi4fp9gy1#

有一个库已经做了你所需要的,即惰性求值,操作的顺序和它的编写方式一样,还有很多其他的好东西,比如多进程或多线程Map/Reduce。它被命名为pyxtension,它是prod ready,通过单元测试覆盖,并在PyPi上维护。而且它是在MIT许可下发布的--所以你可以在任何商业项目中免费使用它。你的代码将被改写成这样的形式:

from pyxtension.streams import stream

stream(myList)
    .filter(condition)
    .map(action1)
    .map(action2)
    .toList()

以及

stream(myList)
    .filter(condition)
    .mpmap(action1)   # this is for multi-processing map
    .fastmap(action2) # this is multi-threaded map
    .toList()

注意,最后一条语句toList()做的正是您所期望的--它收集数据,就像在Spark RDD中一样。

g2ieeal7

g2ieeal72#

你可以自己写:

from collections import UserList

class JavaLike(UserList):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.iter = None

    def stream(self):
        self.iter = None

        return self

    def filter(self, function):
        self.iter = filter(function, self if self.iter is None else self.iter)

        return self

    def map(self, function):
        self.iter = map(function, self if self.iter is None else self.iter)

        return self

    def collect(self, collection_class=None):
        if collection_class is None:
            if self.iter is not None:
                ret = JavaLike(self.iter)
                self.iter = None

                return ret

            return JavaLike(self)

        return collection_class(self if self.iter is None else self.iter)

那么类似的语法是可能的:

>>> JavaLike(range(10)).stream().filter(lambda x: x % 2 == 0).map(str).collect(tuple)
('0', '2', '4', '6', '8')
mu0hgdu0

mu0hgdu03#

PyPI上至少有两个模块:lazy-streamspystreams

t98cgbkg

t98cgbkg4#

reversed()不就可以了吗?
[操作2(操作1(项目))用于反转的项目(my_list)if条件(项目)]

相关问题