我有2个包含对象的列表。这两个列表可以按不同顺序具有相同的对象。
我已经覆盖了Object中的equals方法,这样如果对象的一个特定属性与其他Object相同,那么即使其他属性不相同,它们也是相等的。
现在我需要创建一个映射,其中键是来自一个列表的Object,value是来自另一个列表的相同Object。如果一个列表中的对象在另一个列表中没有相同的对象,则在创建Map时应忽略这些对象。
如何使用java流完成此操作?
答案 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
。