我最近接触了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的字段中计算出来的。具体而言:
我知道可以使用收集器的groupingBy使用排序classa->String.ValueOf(ClassA.group)+String.ValueOf(ClassA.id)或类似的lambda对ClassA实例进行分组,但我不知道如何实现每个分组实例的其他计算值。
我希望它解释得足够好。
以下是要采取的步骤;类似于@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:
我有一个来自以下用户的消息列表: 我想从这个消息对象列表中计数并显示。有代码帮助吗?
我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?