gpt4 book ai didi

Java 将对象类型的 ArrayList 转换为另一个对象类型的 ArrayList

转载 作者:行者123 更新时间:2023-12-05 02:05:46 24 4
gpt4 key购买 nike

我有一个带有成员变量的类:

class Filter{
private String key;
private String operator;
private Object value;
}

和类型过滤器列表如下:

[
{
key: status,
operator:equal,
value: active
},
{
key: status,
operator:equal,
value: inactive
},
{
key: name,
operator:equal,
value: jhon
},
{
key: id,
operator:equal,
value: 123
}
]

我想将上面的 List 转换成一个新的 List 如下,如果键是相同的 key: status然后在新列表中只需要一个条目,其值在列表类型中 value: [active, inactive]运算符将是 IN

[
{
key: status,
operator:in,
value: [active, inactive]
},
{
key: name,
operator:equal,
value: jhon
},
{
key: id,
operator:equal,
value: 123
}
]

实现此解决方案的最佳且最有效的方法是什么,最好使用 Java 8 流和 lambda?想避免传统的 for 循环。

最佳答案

您可以使用 Collectors.partitioningBy 根据过滤器的键是否为 "status"List 分成两部分。 Demo

final Map<Boolean, List<Filter>> parts = list.stream()
.collect(Collectors.partitioningBy(f -> "status".equals(f.getKey())));
final Object[] statuses = parts.get(true).stream().map(Filter::getValue).toArray();
final List<Filter> result = parts.get(false);
if (statuses.length != 0) {
result.add(0, new Filter("status", "in", statuses));
}

对于多个键,您可以使用Collectors.groupingBy Demo

final Map<String, List<Filter>> map = list.stream().collect(Collectors.groupingBy(Filter::getKey, LinkedHashMap::new, Collectors.toList()));
final List<Filter> result = map.entrySet().stream()
.map(e -> e.getValue().size() > 1
? new Filter(e.getKey(), "in", e.getValue().stream().map(Filter::getValue).toArray())
: e.getValue().get(0))
.collect(Collectors.toList());

关于Java 将对象类型的 ArrayList 转换为另一个对象类型的 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63160228/

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