【发布时间】:2017-05-13 14:13:48
【问题描述】:
编辑 **请求提供第一种方法的答案也使用reduce方法**
public class Messages {
int id;
String message;
String field1;
String field2;
String field3;
int audId;
String audmessage;
//constructor
//getter or setters
}
public class CustomMessage {
int id;
String msg;
String field1;
String field2;
String field3;
List<Aud> list;
//getters and setters
}
public class Aud {
int id;
String message;
//getters and setters
}
public class Demo {
public static void main(String args[]){
List<Messages> list = new ArrayList<Messages>();
list.add(new Messages(1,"abc","c","d","f",10,"a1"));
list.add(new Messages(2,"ac","d","d","f",21,"a2"));
list.add(new Messages(3,"adc","s","d","f",31,"a3"));
list.add(new Messages(4,"aec","g","d","f",40,"a4"));
list.add(new Messages(1,"abc","c","d","f",11,"a5"));
list.add(new Messages(2,"ac","d","d","f",22,"a5"));
}
我希望将消息与审核进行映射 CustomMessage 必须有 ->1,"abc","c","d","f"----->2 个审计列表 (10,a1) 和 (11,"a5");
有两种方法
1.Reduce-我也想用reduce来创建我自己的累加器和合并器
List<CustomMessage> list1= list.stream().reduce(new ArrayList<CustomMessage>(),
accumulator1,
combiner1);
**I am unable to write a accumulator and combiner**
2.Collectors.groupingBy-
- 我不想使用构造函数来创建 Message 和 自定义消息也不是。这里我的字段较少,我的实际对象有很多字段。任何方式都有一个静态 对象创建方法
-
有没有办法通过编写累加器或减少来做到这一点 合路器
List<CustomMessage> l = list.stream() .collect(Collectors.groupingBy(m -> new SimpleEntry<>(m.getId(), m.getMessage()), Collectors.mapping(m -> new Aud(m.getAudId(), m.getAudMessage()), Collectors.toList()))) .entrySet() .stream() .map(e -> new CustomMessage(e.getKey().getKey(), e.getKey().getValue(), e.getValue())) .collect(Collectors.toList());
谁能帮我解决这两种方法。
【问题讨论】:
-
如果您有类似
new Messages(1,"abc","d","c","f",10,"a1"));的消息以及您拥有的消息会发生什么 -
我的场景不会发生这种情况
-
对于
groupingBy()方法,您的Message类是否定义了equals()(和hashcode())? -
我假设
Aud中的message是String? -
@OleV.V.是的,它有等于和哈希码。它在 id 字段上
标签: java-8 java-stream