对对象引用方法使用双冒号 Java 8

Using double colon for object referenced method Java 8

我有 2 个 List<xxx>,需要用 xxx.getId() 对它们进行交集,所以我使用 StreamLambda。这些步骤是:

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());