在python中以java.util.stream方式处理序列

时间:2019-02-10 15:38:58

标签: python python-3.x java-stream

有人知道我会在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)]

但这是相反的顺序。

我怎么能以正确的顺序买东西?显然我可以使用变量,但随后我必须为每个部分结果找到一个名称。

3 个答案:

答案 0 :(得分:3)

您可以自己编写:

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')

答案 1 :(得分:1)

已经有一个库可以完全满足您的需求,即懒惰求值和操作顺序与编写方式相同,还有其他许多好东西,例如多进程或多线程Map / Reduce。 它的名称为pyxtension,并且已经准备好并在PyPi上进行维护。 您的代码将以以下形式重写:

buffered

use std::fs::File;
use std::io::{self, BufRead, BufReader};

fn main() -> io::Result<()> {
    let file_path = "input.txt";
    let input = File::open(file_path)?;
    let buffered = BufReader::new(input);
    let line_count = buffered.lines().count();

    let input = File::open(file_path)?;
    let buffered = BufReader::new(input);
    for (nr, line) in buffered.lines().enumerate() {
        println!("LOADED: [{}/{}]", nr, line_count);
    }

    Ok(())
}

请注意,最后一条语句from pyxtension.strams import stream stream(myList) .filter(condition) .map(action1) .map(action2) .toList() 符合您的期望-收集的数据与Spark RDD中发生的情况相同。

答案 2 :(得分:0)

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