Xác định chính bạn một đối tượng khóa giữ và so sánh các thuộc tính mong muốn.Trong trường hợp đơn giản này, bạn có thể sử dụng một danh sách nhỏ trong khi mỗi chỉ mục tương ứng với một thuộc tính. Đối với trường hợp phức tạp hơn, bạn có thể sử dụng một Map
(sử dụng tên thuộc tính như phím) hoặc một lớp chuyên dụng:
Function<Person,List<Object>> toKey=p -> Arrays.asList(p.getName(), p.getAge());
Có như vậy một chức năng lập bản đồ. bạn có thể sử dụng giải pháp đơn giản:
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)+"}"));
có thể dẫn đến hiệu suất kém khi bạn có danh sách khá lớn. Khi bạn có danh sách lớn (hoặc không thể dự đoán kích thước của chúng), bạn nên sử dụng một trung gian Set
để đẩy nhanh tiến độ tra cứu (thay đổi phức tạp thời gian của nhiệm vụ O(n²)
-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)+"}"));
Trong ví dụ trên, mỗi phù hợp được in. Nếu bạn chỉ quan tâm đến việc liệu một trận đấu như vậy tồn tại, bạn có thể sử dụng một trong hai:
boolean exists=list1.stream().map(toKey)
.anyMatch(key -> list2.stream().map(toKey).anyMatch(key::equals));
hoặc
boolean exists=list2.stream().map(toKey)
.anyMatch(list1.stream().map(toKey).collect(Collectors.toSet())::contains);
trong trường hợp của tôi, bằng không có thể được overrided – TNN