当前位置: 首页 > 知识库问答 >
问题:

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

翟昊明
2023-03-14

我最近接触了Java 8和它的Stream API,最近又接触了它的Collectors API,我发现它有潜力对Stream进行很多很多的转换,但我有一个情况,我不确定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组合对类进行分组
  • 当关键字=1时,分组的ClassB实例将具有newTitle=title,或者当关键字=2时具有newTitle=specialValue
  • 和最后的joinedDescriptions,是来自分组的ClassA实例的所有描述的串联。

我知道可以使用收集器的groupingBy使用排序classa->String.ValueOf(ClassA.group)+String.ValueOf(ClassA.id)或类似的lambda对ClassA实例进行分组,但我不知道如何实现每个分组实例的其他计算值。

我希望它解释得足够好。

共有1个答案

澹台华翰
2023-03-14

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

按照您在文章中提到的方式对源列表进行分组,然后在classB中添加一个构造函数,该构造函数接受classA的列表,然后执行您提到的设置标题和连接描述的逻辑:

因此这将是您的流管道:

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()));
}
 类似资料:
  • 问题内容: 我的ViewValue类定义如下: 在我的代码中,我需要将ViewValue实例列表转换为包含来自相应ViewValue的id字段值的列表。 我用foreach循环来做: } 有没有更好的方法来解决这个问题? 问题答案: 编辑:此答案基于以下想法:您需要对代码中其他位置的不同实体和不同属性执行类似的操作。如果您 只需 要按ID将ViewValues列表转换为Longs列表,则请坚持使用

  • 我正在使用控制台制作一个纸牌游戏。一个类,分发商,包含一个名为的方法。 此方法接受一个播放器数组作为参数,其中包含所有实例化的播放器对象。分发商类还包含一个名为

  • 问题内容: 我需要使用特定对象的属性(位置)对对象(学生)列表进行分组,代码如下所示, 请给我建议一个干净的方法。 问题答案: In Java 8:

  • 我有一个来自以下用户的消息列表: 我想从这个消息对象列表中计数并显示。有代码帮助吗?

  • 我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?