如何使用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