gpt4 book ai didi

java-8 - java 8使用reduce和Collectors分组来获取列表

转载 作者:行者123 更新时间:2023-12-02 03:55:55 27 4
gpt4 key购买 nike

编辑**请求提供也使用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-

  • 我不想使用构造函数来创建消息并且 对于自定义消息都不是。这里我的字段较少,我的实际对象有很多字段。有什么方法可以有一个静态的 对象创建方法
  • 有没有办法通过写入累加器或通过减少来做到这一点 组合器

          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());

任何人都可以帮助我解决这两种方法吗?

最佳答案

此代码将创建 CustomMessageCollection。我建议在 CustomMessage 中放置一个带有 Messages 参数的构造函数。也许还可以将 mergeFunction 从 collect 中移出。

Collection<CustomMessage> customMessages = list.stream()
.collect(toMap(
Messages::getId,
m -> new CustomMessage(m.getId(), m.getMessage(), m.getField1(), m.getField2(), m.getField3(),
new ArrayList<>(singletonList(new Aud(m.getAudId(), m.getAudmessage())))),
(m1, m2) -> {
m1.getList().addAll(m2.getList());
return m1;
}))
.values();

什么toMap这里的作用是:第一次遇到 Messages id 时,它会将其作为键放入 Map,其值为新创建的 CustomMessage toMap 的第二个参数(“valueMapper”)。下次它将合并两个 CustomMessage 与第三个参数“mergeFunction”,这将有效连接 2 个 Aud 列表。

如果您绝对需要一个 List 而不是 Collection:

List<CustomMessage> lm = new ArrayList<>(customMessages);

关于java-8 - java 8使用reduce和Collectors分组来获取列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43938467/

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