首页 文章

Java收集器:将Object列表分组为具有计算值的其他对象的列表

提问于
浏览
0

我最近开始使用Java 8及其Stream API,最近收集了它的Collectors API,我发现它有可能进行许多转换流,但我有一种情况我不确定是否可能用java 8甚至可能 . 我有两节课:

public class ClassA{
    public int group
    public int id
    public String title
    public String description
    public String keyword
    public String specialValue
}

public class ClassB{
    public String newTitle
    public String joinedDescriptions
}

我想知道是否可以从ClassA对象列表中生成一个ClassB对象的分组列表,其中包含从ClassA的字段计算的值 . 具体来说:

  • 通过group和id的组合对ClassA进行分组

  • 当关键字= 1时,分组的ClassB实例将具有newTitle = title,或者当keyword = 2时,newTitle = specialValue

  • 最后加入了描述,是来自分组的ClassA实例的所有描述的串联 .

我知道可以使用Collectors的groupingBy使用排序classA的lambda - > String.valueOf(classA.group)String.valueOf(classA.id)或类似的方法对ClassA实例进行分组,但我不知道实现每个分组实例的其他计算值 .

我希望它解释得很好 .

1 回答

  • 0

    以下是要采取的步骤;类似于@Joakim Danielson在评论中提到的:

    如您在帖子中提到的那样对源列表进行分组,然后在 ClassB 中添加一个构造函数,该构造函数获取 ClassA 的列表,然后在设置 Headers 和加入描述方面执行您提到的逻辑:

    所以这将是你的流管道:

    List<ClassB> result = source.stream()
                    .collect(groupingBy(s -> s.getGroup() + "" + s.getId())) // Map<String, List<ClassA>>
                    .values()  // Collection<List<ClassA>>
                    .stream() // Stream<List<ClassA>>
                    .map(ClassB::new) // Stream<ClassB>
                    .collect(Collectors.toList()); //List<ClassB>>
    

    你需要在ClassB中定义一个构造函数:

    public ClassB(List<ClassA> source) {
            ClassA item = source.get(0);
            if(“1”.equals(item.getKeyword())
                 this.newtitle = item.getTitle();
            else if(“2”.equals(item.getKeyword())
                 this.newtitle = “specialValue”; // or make a call to a method to compute the value
            this.joinedDescriptions = String.join(“, “, source.stream().map(ClassA::getDescription).collect(toList()));
    }
    

相关问题