首页 > 解决方案 > 如何在java 8中用流替换for循环

问题描述

我正在使用下面的方法,需要在 java 8 中使用流和 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 循环?

标签: javafor-loopobjectjava-8java-stream

解决方案


你不需要putIfAbsent。您可以流式传输数组的元素并将它们收集到 a 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]);

推荐阅读