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

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());

以上是 如何使用Lambda表达式.reduce()方法减少给定列表 的全部内容, 来源链接: utcz.com/qa/430882.html

回到顶部