【问题标题】:How to use jdk8 to group by and filter the ArrayList<Object>如何使用 jdk8 对 ArrayList<Object> 进行分组和过滤
【发布时间】:2019-11-01 03:34:32
【问题描述】:

这是一个对象调用 Mon。它有两个属性,开始和结束,都是字符串。 结束属性可以包括“;”像这样

Mon m1 = new Mon(); m1.setStart("A"); m1.setEnd("a;b");
Mon m2 = new Mon(); m2.setStart("A"); m2.setEnd("b");
Mon m3 = new Mon(); m3.setStart("C"); m3.setEnd("c");
Mon m4 = new Mon(); m4.setStart("A"); m4.setEnd("c");

这是一个 ArrayList。

List<Mon> list = new ArrayList();
list.add(m1);list.add(m2);list.add(m3);list.add(m4);

现在我想按开始属性和结束属性对列表进行分组,但基于末尾包含“;”,所以我也想将 m1 和 m2 放入同一组,因为 m1.end 包含m2.end,但 m4 在另一组中,因为 m4 的 start 和 end 与 m1,m2 不同。

我尝试使用 Collectors.groupingBy 按开始分组

Map<String, List<Mon>> map = list.stream().collect(Collectors.groupingBy(d -> d.getStart()));

但这不是我想要的结果 输出如下:

key: Aa;b OR Ab , value: m1, m2
key: Cc, value: m3
key: Ac, value: m4

有什么方法可以实现吗,jdk8的流功能也比较好

非常感谢

【问题讨论】:

  • 你能解释一下,组是什么意思
  • 到目前为止你有什么尝试?
  • @ShaileshChandra 我的意思是按开始属性对列表进行分组,就像这样Map&lt;String, List&lt;Mon&gt;&gt; map = list.stream().collect(Collectors.groupingBy(d -&gt; d.getStartMsgType()));
  • @RavindraRanwala 我尝试使用 Collectors.groupingBy,但我只能对起始属性进行分组,不知道如何检查结束属性,因为它包含“;”
  • 为什么需要检查 end 属性。我看不出这样做有什么意义?只是 groupingBy start 给出了预期的结果 afaiu。

标签: java java-8 java-stream


【解决方案1】:

以下应该会为您提供预期的结果..

Mon m1 = new Mon(); m1.setStart("A"); m1.setEnd("a;b");
Mon m2 = new Mon(); m2.setStart("A"); m2.setEnd("b");
Mon m3 = new Mon(); m3.setStart("C"); m3.setEnd("c");

List<Mon> list = new ArrayList();
list.add(m1);list.add(m2);list.add(m3);

Function<Mon, String> compositeKey = mon -> mon.getStart()+mon.getEnd();

Map<String, List<Mon>> resultMap = list.stream().collect(Collectors.groupingBy(compositeKey,Collectors.toList()));

注意: 对于键中的 char 级别匹配,您必须在 list.stream().forEach(){ mon -&gt;.... 中编写 lambda 表达式我不认为 OOB 函数无法解决复杂的要求。甚至 Hashmap 函数也是基于精确键匹配的。如果我看到您的预期结果,那甚至不是包含匹配 key: Aa;b OR Ab

final Map<String, List<Mon>> resultMap = new HashMap();
list.stream().forEach(mon -> {
     resultMap.put(mon.getStart()+getEnd(), ....);
});

祝你好运,但坦率地说,这是一个奇怪的实现,您希望在 Map 键中应用匹配的字符。不知道你想用它实现什么目标。

【讨论】:

  • 我更新了上面的问题和输出,你能建议吗?
  • 亲爱的 Gentle,我无法理解您的输入和输出的分组模式。你想用concatenating getStart() and getEnd()做钥匙吗?是的,为什么我们没有使用密钥Ab 的条目?此外,您的查询语句仍然只想按 getStart() 分组,但您的预期输出不支持它。你能解决你的问题吗
  • 我更新了上面的问题和输出,你能建议吗?如果我们想要密钥 Ab,我们该怎么做呢?
  • 为您更新的查询更改了它。检查它是否有效。没测试过。
  • StringUtils 来自哪个包?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2022-06-20
  • 1970-01-01
相关资源
最近更新 更多