Zdefiniuj sobie kluczowy obiekt, który przechowuje i porównuje pożądane właściwości.W tym prostym przypadku możesz użyć małej listy, podczas gdy każdy indeks odpowiada jednej właściwości. W bardziej skomplikowanych przypadkach można użyć Map
(używając nazwy właściwości jak klucze) lub dedykowaną klasę:
Function<Person,List<Object>> toKey=p -> Arrays.asList(p.getName(), p.getAge());
z taką funkcją mapowania. możesz użyć prostego rozwiązania:
list1.stream().map(toKey)
.flatMap(key -> list2.stream().map(toKey).filter(key::equals))
.forEach(key -> System.out.println("{name="+key.get(0)+", age="+key.get(1)+"}"));
co może prowadzić do niskiej wydajności, gdy masz dość duże listy. Gdy masz duże listy (lub nie jest w stanie przewidzieć ich rozmiary), należy użyć pośrednią Set
przyspieszyć wyszukiwanie (zmiana czasu złożoność zadania jest od O(n²)
do O(n)
):
list2.stream().map(toKey)
.filter(list1.stream().map(toKey).collect(Collectors.toSet())::contains)
.forEach(key -> System.out.println("{name="+key.get(0)+", age="+key.get(1)+"}"));
W powyższych przykładach, każdy mecz zostanie wydrukowany. Jeśli jesteś zainteresowany tylko tym, czy istnieje taki mecz, można użyć albo:
boolean exists=list1.stream().map(toKey)
.anyMatch(key -> list2.stream().map(toKey).anyMatch(key::equals));
lub
boolean exists=list2.stream().map(toKey)
.anyMatch(list1.stream().map(toKey).collect(Collectors.toSet())::contains);
w moim przypadku jest równy nie może być overrided – TNN