【问题标题】:How to replace for loop with stream in java 8如何在java 8中用流替换for循环
【发布时间】:2020-10-04 13:18:03
【问题描述】:

我正在使用下面的方法,需要在java 8中使用stream和lamdas。

public static void addMemberships(final int key, MembershipData[] members) throws SpiderException
  {
    HashMap<String, MembershipData> duplicates = new HashMap<>();
    for(MembershipData m: members) {
      duplicates.putIfAbsent(m.subjectOfCare, m);
    }
    members = duplicates.values().toArray(new MembershipData[0]);
    internalMembershipToolkit.verifyData(key, members);
}

我尝试使用 members.forEach(duplicates.putIfAbsent(m.subjectOfCare, m)); 但它没有用。 如何用流替换 for 循环?

【问题讨论】:

  • members 是一个数组,你必须使用Arrays.stream(members)... 为什么需要一个流?
  • 是的,没关系。我需要摆脱 forloop

标签: java for-loop object java-8 java-stream


【解决方案1】:

您不需要putIfAbsent。您可以流式传输数组的元素并将它们收集到Map,使用合并函数来消除重复项。

Map<String, MembershipData> duplicates = 
    Arrays.stream(members)
          .collect(Collectors.toMap(m -> m.subjectOfCare,
                                    Function.identity(),
                                    (m1,m2)->m1));

或者,在同一语句中包含到数组的转换:

members = 
    Arrays.stream(members)
          .collect(Collectors.toMap(m -> m.subjectOfCare,
                                    Function.identity(),
                                    (m1,m2)->m1))
          .values()
          .toArray(new MembershipData[0]);

【讨论】:

  • 它有效。你能解释一下这里的 m1 和 m2 代表什么吗?
  • @ShaviPathirana 它们代表具有相同键的 Map 的两个值(MembershipData 实例)。 (m1,m2)->m1 表示如果两个值具有相同的key,第一个值将保留在Map中,第二个值将被丢弃。
  • 对数组转换前收集的值采用distinctByKey 方法怎么样?
  • @Naman distinctByKey 在哪里定义(以及在哪个 Java 版本中)?我不熟悉这种方法。
  • @Eran 这不是 JDK 的内置功能,但这里有一个 Q&A 说明它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
相关资源
最近更新 更多