gpt4 book ai didi

Java使用流中的重复元素创建多个列表

转载 作者:行者123 更新时间:2023-12-05 09:34:22 26 4
gpt4 key购买 nike

我正在尝试获取列表并返回 Map<String, List<String>包含原始列表的某些方面,其中原始元素可以使用流作为不同键下的值多次出现。例如:

class Employee {
String firstName;
String lastName;
Status status;
}

enum Status {
FULL_TIME,
PART_TIME
}

List<Employee> employees = List.of(
new Employee("f1", "l1", Status.PART_TIME),
new Employee("f2", "l2", Status.FULL_TIME),
new Employee("f3", "l3", Status.PART_TIME),
new Employee("f4", "l4", Status.FULL_TIME));

生成的映射应具有如下所示的键,并且列表需要是不可变的:

fName: ["f1", "f2", "f3", "f4"],
lName: ["l1", "l2", "l3", "l4"],
fullTime: ["f2 l2", "f4 l4"]

这对于多个流来说很容易,但是原始数据非常大,所以我尝试一次性完成。如果还有其他我不知道的方法,我也可以使用 Guava 和 Apache Commons。谢谢!

编辑 1:展示我现在是怎么做的

这是我在三个流中所做的,我想将其简化为一个:

var firstName = employees.stream()
.map(e -> e.getFirstName())
.collect(Collectors.toUnmodifiableList());
var lastName = employees.stream()
.map(e -> e.getLastName())
.collect(Collectors.toUnmodifiableList());
var fullTime = employees.stream()
.filter(e -> e.getStatus().equals(Status.FULL_TIME))
.collect(Collectors.toUnmodifiableList());

最佳答案

您可以将员工对象转换为 pairs 的列表其中键对是映射键,键值对是列表的单个值。然后您可以按键“分组”。

Map<String, List<String>> vals = employees.stream()
.map(e -> Arrays.asList(
Pair.of("fname", e.firstName),
Pair.of("lname", e.lastName),
e.status == Status.FULL_TIME ? Pair.of("fullTime", e.firstName + " " + e.lastName) : null
))
.flatMap(Collection::stream)
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(p -> p.getLeft(),
Collectors.mapping(p -> p.getRight(), Collectors.toUnmodifiableList())));

然而,这个解决方案的内存消耗比我的 previous answer 中的那个要差。 ,特别是在处理大数据流时。

关于Java使用流中的重复元素创建多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66716777/

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