python 中的函数式编程 - 一起使用 map()、filter() 和 sum() - java .stream() 等效吗?

问题描述 投票:0回答:3

我正在学习 Python 和 Java 中的函数式编程。

我有一些 Java 代码,可以从列表中找出双偶数之和。

我想在Python中使用函数式编程来做同样的事情(即从列表中找到双偶数的总和)。将filter()、map() 和sum() 一起使用并使代码变得可读有什么好的做法?

我用 Python 编写的内容(见下文)可以完成这项工作,但可读性不太好。

感谢您的帮助!

# JAVA

import java.util.Arrays;
import java.util.List;
public class GFG {
    public static void main(String[] args)
    {
        List<Integer> numbers
            = Arrays.asList(11, 22, 33, 44,
                            55, 66, 77, 88,
                            99, 100);
 
        System.out.println(
            numbers.stream()
                .filter(number -> number % 2 == 0)
                .mapToInt(e -> e * 2)
                .sum());
    }
}

// OUTPUT: 640 

# PYTHON 

class GFG:

    @staticmethod
    def main():
        numbers = [11, 22, 33, 44, 55, 66, 77, 88, 99, 100]
        print(sum(map(lambda x: x * 2, (filter(lambda x: x % 2 == 0, numbers)))))
   

GFG.main()

# OUTPUT: 640 

python functional-programming
3个回答
1
投票

sum
生成器表达式一起使用。

sum(x * 2 for x in numbers if x % 2 == 0)

0
投票

Python 可读性较差的原因是

map
filter
等在 Java 中是方法,而在 Python 中是函数。这意味着在 Java 中,您可以使用缩进使所有内容以流畅的方式从左到右阅读。

没有什么特别的原因不能在 Python 中创建自己的流:

class MyStream:
     def __init__(iterator):
          self.iterator = iterator

     def map(func):
          return MyStream(map(func, self.iterator))
     
     def filter(func):
          return MyStream(filter(func, self.iterator))
     ...

实际上没有人会在 Python 中执行此操作,因为列表理解和生成器表达式被认为更具可读性。


0
投票

我想提一下我编写的

streamable
模块(很想得到反馈!):

你的例子看起来像:

from typing import List
from streamable import Stream

numbers: List[int] = [11, 22, 33, 44, 55, 66, 77, 88, 99, 100]

print(
    sum(
        Stream(lambda: numbers)
        .filter(lambda number: number % 2 == 0)
        .map(lambda e: e * 2)
    )
)
640
  • 这是一个类型化模块,具有 100% 代码覆盖率且无依赖性
  • Stream[T]
    课程扩展
    Iterable[T]
  • 流是不可变的
  • 操作是惰性评估的,涵盖并发、分组/扁平化、异常捕获、速率限制、迭代进度日志记录……
© www.soinside.com 2019 - 2024. All rights reserved.