gpt4 book ai didi

java - 在 Java 中压缩和扩展对象

转载 作者:行者123 更新时间:2023-11-30 08:05:25 25 4
gpt4 key购买 nike

我有以下要求。

假设我有 Activity 类

class Activity{
String name;
String activityId;
List<String> activityIds = new ArrayList<>();
// ...
}

现在,我有一个 Activity 列表 ( List<Activity> )。有些 Activity 可以具有相同的名称,但具有不同的 activityId。在这种情况下,我想创建相同的 Activity 对象,带有一个 nullactivityId 和 activityId 列表。

我也想反过来。

我已经写好了代码。有更好的方法吗?

示例输入:

Activity a1 = new Activity("ABC","Mark");
Activity a2 = new Activity("1","Boucher");
Activity a3 = new Activity("2","Portman");
Activity a4 = new Activity("3","Mark");
Activity a5 = new Activity("4","Caprio");
Activity a6 = new Activity("PQR","Portman");
List<Activity> activities = Arrays.asList(a1,a2,a3,a4,a5,a6);

示例输出:

[Activity [name=Portman, activityId=null, activityIds=[2, PQR]]
, Activity [name=Caprio, activityId=null, activityIds=[4]]
, Activity [name=Mark, activityId=null, activityIds=[ABC, 3]]
, Activity [name=Boucher, activityId=null, activityIds=[1]]
]

我也想做相反的事情,这将打印原始列表。

我已经写好了代码。 Full code is here . 有没有更好的方法呢?

private static List<Activity> squashDTO(List<Activity> dtoList){    
List<Activity> filteredActivity = new ArrayList<>();
Map<String, List<Activity>> activityMap = dtoList.stream().collect(Collectors.groupingBy(Activity::getName));
activityMap.forEach(( key,value) ->{
Activity a = new Activity(value.get(0).getName());
List<String> activityIds = new ArrayList<>();
for(Activity aa : value){
activityIds.add(aa.getActivityId());
}
a.setActivityIds(activityIds);
filteredActivity.add(a);
});
return filteredActivity;
}

和展开 Activity

private static List<Activity> expandDTO(List<Activity> dtoList){
List<Activity> newList = new ArrayList<Activity>();
for(Activity a : dtoList){
for(String activityId : a.getActivityIds()){
Activity n = new Activity(activityId,a.getName());
newList.add(n);
}
}
return newList;
}

最佳答案

您想要的是按 Activity 名称分组并将其 ID 收集到列表中。

这是通过使用 groupingBy(classifier, downstream) 完成的集电极。在这种情况下,下游收集器将每个 Activity 映射到它们的 id,并将它们收集到一个列表中。有了这个,我们获得了一张 map ,我们需要对其进行后处理以获得所需 Activity 的列表。因此,这被包装到 collectingAndThen 中将 map 的每个条目映射到 Activity 中的收集器用null编号。

(注意:以下假定构造函数 public Activity(String activityId, String name, List<String> activityIds) 和每个属性的 setter/getter )

List<Activity> output =
activities.stream()
.collect(collectingAndThen(
groupingBy(
Activity::getName,
mapping(Activity::getActivityId, toList())
),
m -> m.entrySet().stream()
.map(e -> new Activity(null, e.getKey(), e.getValue()))
.collect(toList())
));

要反转并重建输入列表,我们需要按 Activity ID 展平。在下文中,通过将名称和 ID 列表存储在临时 SimpleEntry 中来展平列表。 (仅用作元组)最后,所有这些都收集回 Activity 列表中。

List<Activity> input =
output.stream()
.flatMap(a -> a.getActivityIds().stream().map(l -> new AbstractMap.SimpleEntry<>(l, a.getName())))
.map(e -> new Activity(e.getKey(), e.getValue()))
.collect(toList());

使用的静态导入:

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;

关于java - 在 Java 中压缩和扩展对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35069913/

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