Krydsning af to lister i Java

1. Oversigt

I denne vejledning lærer vi, hvordan man henter krydset mellem to Listes.

Som mange andre ting er dette blevet meget lettere takket være introduktionen af ​​streams i Java 8.

2. Skæringspunkt mellem to lister over strenge

Lad os oprette to Listes af Snors med noget kryds - begge har nogle duplikerede elementer:

Liste liste = Arrays.asList ("rød", "blå", "blå", "grøn", "rød"); List otherList = Arrays.asList ("rød", "grøn", "grøn", "gul");

Og nu Vi bestemmer krydset mellem listerne ved hjælp af streammetoder:

Indstil resultat = list.stream () .distinct () .filter (otherList :: indeholder) .collect (Collectors.toSet ()); Indstil commonElements = ny HashSet (Arrays.asList ("rød", "grøn")); Assert.assertEquals (commonElements, result);

Først fjerner vi de duplikerede elementer med tydelig. Derefter bruger vi filter for at vælge de elementer, der også er indeholdt i otherList.

Endelig konverterer vi vores output med en Samler. Skæringspunktet skal kun indeholde hvert fælles element en gang. Ordren burde således ikke have noget at gøre at sætte er det mest ligefremme valg, men vi kan også bruge toListe eller en anden opsamlingsmetode.

For flere detaljer, se vores guide til Java 8's Collectors.

3. Skæringspunkt mellem lister over brugerdefinerede klasser

Hvad hvis vores Listes indeholder ikke Snors men snarere forekomster af en brugerdefineret klasse, vi har oprettet? Nå, så længe vi følger Java's konventioner, fungerer løsningen med streammetoder fint for vores brugerdefinerede klasse.

Hvordan fungerer det indeholder metode beslutte, om et bestemt objekt vises på en liste? Baseret på lige med metode. Således er vi nødt til at tilsidesætte lige med metode og sørg for, at den sammenligner to objekter baseret på værdierne for de relevante egenskaber.

For eksempel er to rektangler ens, hvis deres bredder og højder er ens.

Hvis vi ikke tilsidesætter lige med metode bruger vores klasse lige med implementering af forældreklassen. I slutningen af ​​dagen, eller rettere, arvekæden, den Objekt klasse ' lige med metoden bliver udført. Så er to forekomster kun ens, hvis de henviser til nøjagtigt det samme objekt på bunken.

For mere information om lige med metode, se vores artikel om Java lige med() og hashCode () Kontrakter.

4. Konklusion

I denne hurtige artikel har vi set, hvordan man bruger streams til at beregne skæringspunktet mellem to lister. Der er mange andre operationer, der plejede at være ret kedelige, men som er ret enkle, hvis vi kender os rundt i Java Stream API. Se vores yderligere tutorials med Java-streams her.

Kodeeksempler er tilgængelige på GitHub.