对对象引用方法使用双冒号 Java 8
Using double colon for object referenced method Java 8
我有 2 个 List<xxx>
,需要用 xxx.getId()
对它们进行交集,所以我使用 Stream
和 Lambda
。这些步骤是:
List<xxx> list1 = function1();
List<xxx> list2 = function2();
List<String> list1InString = list1.stream().map(input -> input.getId()).collect(toList());
list2 = list2.stream().filter(input -> list1InString.contains(input.getId())).collect(toList());
我想通过使用 double colon
来做到这一点,例如:
list2 = list2.stream().filter(list1InString::contains).collect(toList());
但这不是真的,因为 contains
对 xxx 对象的引用不是 String getId() 方法。我知道我浪费时间将 list1 转换为 list1InString,但我不知道有什么更好的方法。任何帮助都非常宝贵,非常感谢。
编辑:感谢许多回答,我只是想通过使用双冒号(这对我来说是新的)使代码更简单,但在这种情况下可能不会使用。特别感谢 Naman 和 Holger 非常清楚我的问题。
您可以使用一些不同的方法:
List<xxx> list1 = function1();
List<xxx> list2 = function2();
Set<String> seen = new HashSet<>();
联合:
Predicate<xxx> distinctFilter = x -> seen.add(x.getId());
result = Stream.concat(list1.stream(), list2.stream())
.filter(distinctFilter)
.collect(toList());
相交:
Predicate<xxx> distinctFilter = x -> !seen.add(x.getId());
result = Stream.concat(list1.stream(), list2.stream())
.filter(distinctFilter)
.collect(toList());
您可以采用如下替代方法:
List<XXX> items = list2.stream()
.map(itemL1->{
return list1.stream().
filter((itemL2)->itemL2.getId().equals(itemL1.getId()))
.collect(Collectors.toList());
}
)
.flatMap(List::stream)
.collect(Collectors.toList());
我有 2 个 List<xxx>
,需要用 xxx.getId()
对它们进行交集,所以我使用 Stream
和 Lambda
。这些步骤是:
List<xxx> list1 = function1();
List<xxx> list2 = function2();
List<String> list1InString = list1.stream().map(input -> input.getId()).collect(toList());
list2 = list2.stream().filter(input -> list1InString.contains(input.getId())).collect(toList());
我想通过使用 double colon
来做到这一点,例如:
list2 = list2.stream().filter(list1InString::contains).collect(toList());
但这不是真的,因为 contains
对 xxx 对象的引用不是 String getId() 方法。我知道我浪费时间将 list1 转换为 list1InString,但我不知道有什么更好的方法。任何帮助都非常宝贵,非常感谢。
编辑:感谢许多回答,我只是想通过使用双冒号(这对我来说是新的)使代码更简单,但在这种情况下可能不会使用。特别感谢 Naman 和 Holger 非常清楚我的问题。
您可以使用一些不同的方法:
List<xxx> list1 = function1();
List<xxx> list2 = function2();
Set<String> seen = new HashSet<>();
联合:
Predicate<xxx> distinctFilter = x -> seen.add(x.getId());
result = Stream.concat(list1.stream(), list2.stream())
.filter(distinctFilter)
.collect(toList());
相交:
Predicate<xxx> distinctFilter = x -> !seen.add(x.getId());
result = Stream.concat(list1.stream(), list2.stream())
.filter(distinctFilter)
.collect(toList());
您可以采用如下替代方法:
List<XXX> items = list2.stream()
.map(itemL1->{
return list1.stream().
filter((itemL2)->itemL2.getId().equals(itemL1.getId()))
.collect(Collectors.toList());
}
)
.flatMap(List::stream)
.collect(Collectors.toList());