从两个列表创建映射,其中键和值为同一对象

时间:2018-05-03 23:16:09

标签: java lambda stream

我有2个包含对象的列表。这两个列表可以按不同顺序具有相同的对象。

我已经覆盖了Object中的equals方法,这样如果对象的一个​​特定属性与其他Object相同,那么即使其他属性不相同,它们也是相等的。

现在我需要创建一个映射,其中键是来自一个列表的Object,value是来自另一个列表的相同Object。如果一个列表中的对象在另一个列表中没有相同的对象,则在创建Map时应忽略这些对象。

如何使用java流完成此操作?

1 个答案:

答案 0 :(得分:0)

我明白你为什么要做这样的事情,但看起来非常黑客。我敢肯定,如果你告诉我们你想要达到的目标,我们可以为你提供更好的设计。无论如何,以下内容适用于Java 10:

var list1 = List.of("One", "Two", "Three");
var list2 = List.of("Two", "Three", "Four");

var set = Set.copyOf(list2);

var map = list1.stream()
               .filter(set::contains)
               .collect(Collectors.toMap(k -> k, v -> list2.get(list2.indexOf(v))));

System.out.println(map);

输出:

{Two=Two, Three=Three}

为Java 8编写的等效代码如下:

List<String> list1 = Arrays.asList("One", "Two", "Three");
List<String> list2 = Arrays.asList("Two", "Three", "Four");

Set<String> set = new HashSet<>(list2);

// Defined the Map here for formatting reasons.
Map<String, String> map;

map = list1.stream()
           .filter(set::contains)
           .collect(Collectors.toMap(k -> k, v -> list2.get(list2.indexOf(v))));

System.out.println(map);

注意:这假定您已覆盖Object#hashCode以及Object#equals