gpt4 book ai didi

Java 8 收集器 API

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:39 25 4
gpt4 key购买 nike

这道题涉及使用 Java 8 收集器对元素进行映射和分组。我有一份病人名单。每个患者都有他访问过的部门的列表。假设我想计算每个部门使用 Java 8 中的新收集器 API 访问了多少次,我将如何按部门列表分组?

谢谢!

注意:我知道我可以在每个部门放一个计数器,这道题纯粹是为了学习java 8的新特性。

代码:

public class Patient {
private String id;
private List<Department> history;
/* some more getters/setters come here */
}

在我的主要方法中,我有一个 Patient 列表。我想知道每个部门被访问了多少次,而无需编辑部门类(或扩展或装饰它)。

我想我必须获取患者流并将他们映射到 dept->count 的 map (每个患者访问哪个部门的次数)。有这些 map 流 - 我不知道如何对这些 map 进行分组和计数。

最佳答案

首先,我假设如果一位患者不止一次访问过某个部门,那么该部门将不止一次出现在该患者的历史列表中。

如果是这种情况,那么我们可以简单地获取我们的患者流并将其 flatMap 到部门流,其中部门的出现表示患者的一次就诊。

然后我们可以将其传递给 groupingBy 收集器。我们要按Department本身进行分类,所以分类器函数就是恒等函数。

对于值,如果 Department 的条目尚不存在,我们希望将 1 作为值,但如果条目存在,我们希望将现有值加 1。有一个名为 counting() 的收集器已经为我们做了这件事,所以我们只需将它作为下游收集器传递给 groupingBy()

结果代码如下:

import static java.util.stream.Collectors.*;

List<Patient> patients = ... ;

Map<Department, Long> frequency =
patients.stream()
.flatMap(p -> p.getHistory().stream())
.collect(groupingBy(d -> d, counting()));

请注意,如果一个部门还没有被访问过,它就会从 map 上消失。如果您有一个部门列表,您可以像这样填写零值:

departments.forEach(d -> frequency.putIfAbsent(d, 0L));

或者如果你想在get端填零,

long numVisits = frequency.getOrDefault(dept, 0L);

关于Java 8 收集器 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com