Diese Antwort gilt nur für Ganzzahlsätze, keine generischen Sätze. Aber für jemanden, der nach Geschwindigkeit sucht, sind Listen von Ganzzahlen manchmal ein guter Fall für komprimierte Bitmaps. Sie sollten, wenn Sie Ihre ganze Zahlen überprüfen Gruppe gut und in einigen Fällen können Sie einige Größenordnungen auf Geschwindigkeit gewinnen, wenn Sie diese (mit com.googlecode.javaewah32, Apache 2.0 Lizenz) tun:
Set<Integer> foo = ImmutableSet.of(1,2,3,4,8,9);
Set<Integer> bar = ImmutableSet.of(1,3,8,5,11);
EWAHCompressedBitmap32 fooBitmap = new EWAHCompressedBitmap32();
EWAHCompressedBitmap32 barBitmap = new EWAHCompressedBitmap32();
//fill bitmaps
foo.stream().forEach(fooBitmap::set);
bar.stream().forEach(barBitmap::set);
//fooBitmap.and(barBitmap) returns intersection of sets now. fast!
ImmutableSet<Integer> intersection = ImmutableSet.<Integer>builder()
.addAll(fooBitmap.and(barBitmap))
.build();
System.out.println(intersection);
Dieser Code ist nur ein Beispiel. Sie könnten/sollten einen anderen Ansatz verwenden, um in die resultierende Menge zu konvertieren. EWAHCompressedBitmap32
ist Iterable<Integer>
also, der Phantasie sind keine Grenzen gesetzt.
Jetzt schneidet der Code oben nur 2 Sätze. Um alle Sätze in der Liste überschneiden, können Sie die üblichen tun reduzieren:
Set<Integer> foo = ImmutableSet.of(1,2,3,4,8,9);
Set<Integer> bar = ImmutableSet.of(1,3,8,5,11);
List<Set<Integer>> sets = ImmutableList.of(foo,bar);
EWAHCompressedBitmap32 res = sets.stream().map(l -> {
EWAHCompressedBitmap32 b = new EWAHCompressedBitmap32();
l.stream().forEach(b::set);
return b;
}).reduce(null, (l, r) -> l == null ? r : l.and(r));
System.out.println(res);
Noch eine weitere Alternative Reduktionssammler zu verwenden ist:
EWAHCompressedBitmap32 res = sets.stream().collect(Collectors.reducing(
//identity
null,
//mapper set -> compressedBitmap
l -> {
EWAHCompressedBitmap32 b = new EWAHCompressedBitmap32();
l.stream().forEach(b::set);
return b;
},
//and-reducer
(l, r) -> l == null ? r : l.and(r)
));
http://stackoverflow.com/questions/31683375/java-8-lambda-intersection-of-two-lists – Wilson
Statt 'ImmutableList.of (foo, bar) .stream()' Sie können einfach verwenden ' Stream.of (foo, bar) '... – Holger
@Wilson: Ich habe diese Frage gesehen. Ich brauche eine Stream-Kreuzung, nicht nur zwei Sätze –