当前位置: 首页 > 面试题库 >

如何使用Lambda表达式.reduce()方法减少给定列表

程正阳
2023-03-14
问题内容
List<Integer> integers = Arrays.asList(1, 2, 3, 5, 6, 8, 9, 10);
integers.stream().filter((integer) -> integer % 2 == 0).collect(Collectors.toList());

如上所示integers是一个列表,我们只需要从中过滤偶数即可。我可以通过使用.filter()方法来实现。但是,有没有可能用.reduce()方法达到相同的目的。希望该.reduce()方法通过执行给定的BynaryOperation过滤掉所有其他元素,并返回简化列表。

如果我对.reduce()方法的理解不正确,请告诉我该方法的确切作用。


问题答案:

您对减排的理解是错误的。reduce将对所有元素重复应用一个函数以获得 单个结果

您似乎想像做还原

1, 2, 3, 5, 6, 8, 9, 10
│  │  │  │  │  │  │  │
└op┘  └op┘  └op┘  └op┘
  │     │     │     │
    result list

实际上,它确实

1, 2, 3, 5, 6, 8, 9, 10
│  │  │  │  │  │  │  │
└op┘  └op┘  └op┘  └op┘
  │    │      │    │
  └─op─┘      └─op─┘
     │          │
     └────op────┘
           │
   final result value

尽管这是一个概念视图,但操作的确切顺序尚未指定。顺序执行将类似于(((1 op 2) op 3) op 4)…并行执行,而并行执行将类似于上面的树之类的执行和部分顺序执行。

reduce如果先将每个元素转换为a List,然后使用将每个列表连接起来的list操作,则可能会滥用结果列表。但是,这样做有两个问题:

  • 它没有提供所需的“跳过(原始列表的)第二个元素”逻辑;如果您看一下上面的树,应该清楚,不可能制定出op在每种可能的执行方案中都能做到的正确函数
  • 创建临时列表并将其连接起来效率很低

可以通过使用来解决后一点collect,这是 可变的
减少,因此,允许您使用可以在其中添加项目的可变列表,但是,它不能解决第一点,包括所需的过滤器将违反合同,并且仅按顺序执行工作。

因此,解决方案是为filter源列表范围内的所有元素定义一个,然后使用进行可变归约以创建结果列表collect,这很奇怪,这正是您的原始代码所做的:

… .filter(integer -> integer % 2 == 0).collect(Collectors.toList());


 类似资料:
  • 本文向大家介绍Python lambda表达式filter、map、reduce函数用法解析,包括了Python lambda表达式filter、map、reduce函数用法解析的使用技巧和注意事项,需要的朋友参考一下 前言 lambda是表达式,用于创建匿名函数,可以和filter、map、reduce配合使用。 本文环境Python3.7。 一、lambda表达式 lambda 只包含一个语句

  • 我在这里有一段代码,基本上只是创建一个等于参数的线程数,在每个线程中实例化一个MyRunnable对象,将线程添加到线程列表中,然后根据for循环的迭代设置线程的名称。 我的问题是,有没有更干净的方法?是否可以使用流将此功能封装在lambda中?

  • 基本上,我有一个列表,它的元素将被一个一个地处理,直到满足某个条件。如果任何元素满足该条件,则应返回,否则返回。该方法如下所示: 有没有一种方法可以在满足条件后立即跳出这个forEach循环,而不是循环所有元素?

  • 问题内容: 假设我有一个通用接口: 和方法sort: 我可以调用此方法并将lambda表达式作为参数传递: 那会很好的。 但是现在,如果我将接口设为非泛型,并且将方法设为泛型: 然后像这样调用: 它不会编译。它在lambda表达式中显示错误: “目标方法是通用的” 好的,当我使用编译时,它显示以下错误: 从此错误消息看来,编译器似乎无法推断类型参数。是这样吗 如果是,那为什么会这样呢? 我尝试了各

  • IntelliJ一直建议我用方法引用替换我的lambda表达式。 两者之间有什么客观差异吗?

  • 本文向大家介绍Java8使用lambda表达式调用静态方法,包括了Java8使用lambda表达式调用静态方法的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式允许您将功能作为参数传递给方法。您还可以使用lambda表达式调用现有的方法。 方法引用是简单的、易于阅读的lambda表达式,可以通过lambda表达式中的名称调用/引用现有的方法。可以使用方法引用引用类中定义的静态