Finden element matching in 2 Listen, die mit java 8 stream
Mein Fall ist:
class Person {
String id ;
String name;
String age;
}
List<Person> list1 = {p1,p2, p3};
List<Person> list2 = {p4,p5, p6};
Möchte ich wissen, ob es die person in list1
mit den gleichen Namen und das Alter in list2
aber nicht dagegen, über id
.
Was ist am besten und schnell Weg?
- in meinem Fall, gleich kann nicht sein overrided
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definieren Sie sich ein Schlüssel-Objekt und vergleicht die gewünschten Eigenschaften. In diesem einfachen Fall, können Sie eine kleine Liste, in der Erwägung, dass jeder index entspricht einer Eigenschaft. Bei komplexeren Fällen, können Sie eine
Map
(mithilfe von property-Namen als Schlüssel) oder eine dedizierte Klasse:Solch eine mapping-Funktion. Sie können die einfache Lösung:
führen zu schlechter Leistung, wenn Sie eher große Listen. Wenn Sie große Listen (oder können nicht Vorhersagen, Ihre Größen), sollten Sie eine intermediate
Set
zur Beschleunigung der Suche (ändern der task-Zeit-Komplexität vonO(n²)
zuO(n)
):In den obigen Beispielen, jedes match wird gedruckt. Wenn Sie nur daran interessiert, ob eine solche übereinstimmung vorhanden ist, können Sie entweder:
oder
Einen einfachen Weg, das zu tun, ist das überschreiben
equals
undhashCode
. Da ich davon ausgehe das die Gleichstellung vonPerson
müssen auch berücksichtigen, dieid
Feld, können Sie wickeln Sie diese Instanz in einePersonWrapper
die Umsetzung der richtigenequals
undhashCode
(d.h. nur diename
undage
Felder):Mit einer solchen Klasse können Sie dann die folgenden:
Dieser code wandelt die
list2
in eineSet
des umschlossenen Personen. Das Ziel einesSet
ist, um eine Konstante-timecontains
Betrieb für eine bessere Leistung.Dann, die
list1
gefiltert wird. Jedes element gefunden inset2
gehalten wird und wenn es ein element Links (das heißt, wennfindFirst()
gibt eine nicht leereOptional
), es bedeutet, dass ein element gefunden wurde.equals
implementiert, siehe meine Antwort.Brute-force -, sondern Reine java-8-Lösung wird dies:
Hier, flatmap wird verwendet, um beitreten zu 2 Listen.
limit
verwendet wird, so sind wir daran interessiert, im ersten Spiel nur, in dem Fall, brauchen wir nicht zu durchqueren weiter.Gut, wenn Sie nicht über die Pflege der
id
Feld, dann können Sie dieequals
Methode, um dieses Problem zu lösen.Hier ist die
Person
Klasse codeJetzt können Sie stream, um die Kreuzung so gerne.
common
enthält allePerson
Objekte, woname
undage
sind die gleichen.Dieser funktionieren würde:
Seit
forEach()
nimmt der Verbraucher, haben wir keine Möglichkeit der Rückkehr undPresentOrNot {}
ist ein workaround.Beiseite: Wo didi bekommen Sie ein solches Erfordernis 🙂
Müssen Sie zur Iteration über die beiden Listen vergleichen und die atributtes.