【问题标题】:Java streams: how to implement this mapping?Java 流:如何实现这种映射?
【发布时间】:2019-07-23 10:18:36
【问题描述】:

我想提交以下映射案例:

public class A
{
   private String v1;
   private String v2;
   private String v3;
   ....
}

public class B
{
  private String v2;
  private String v3;
  ...
  public B (A a)
  {
    v2 = a.getV2();
    v3 = a.getV3();
  }
  ...

现在,鉴于这两个类,我需要提供以下映射:

List<A> -> Map<String, List<B>>

其中map中的String是通过groupingBy收集器得到的A的值v1。

我尝试了几种方法来实现此映射,但我无法找出最好的方法。

【问题讨论】:

  • 当你“尝试了几种方法”时,展示你所尝试的并解释你为什么不满意。

标签: java lambda java-8 java-stream grouping


【解决方案1】:

首先对 v1 值使用 groupingBy 收集器,然后使用mapping 下游收集器将 A 实例映射到对应的 B ,然后将其收集到可变容器中。这是它的外观。

Map<String, List<B>> v1ToBList = aList.stream()
    .collect(Collectors.groupingBy(A::getV1, 
    Collectors.mapping(B::new, Collectors.toList())));

【讨论】:

  • 您的解决方案有效,并且与我能想到的相比更好。非常感谢。
【解决方案2】:

您可以使用map函数单独使用return v1和其他字符串,然后使用Collectors.toMap函数收集它。

aList.stream()
        .map(item -> Arrays.asList(item.getV1(), Arrays.asList(item.getV2(), item.getV3())))
        .collect(Collectors.toMap(list -> list.get(0), list -> l.get(1)));

此语句将返回带有所需输出的地图。

请注意,Collectors.toMap 函数需要两个 FunctionalInterface Functions,每个用于一个键和一个值。如果您愿意,我可以详细说明该功能。

如果你想了解更多关于这件事如何工作的解释,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多