Guava
Als Ihr [Guava] Tag schon sagt, sind die meisten Guava Sammlung Operationen faul - sie werden nur einmal angewendet benötigt. Zum Beispiel:
List<String> strings = Lists.newArrayList("1", "2", "3");
List<Integer> integers = Lists.transform(strings, new Function<String, Integer>() {
@Override
public Integer apply(String input) {
System.out.println(input);
return Integer.valueOf(input);
}
});
Dieser Code scheint eine List<String>
ein List<Integer>
während auch die Saiten mit dem Ausgang Schreiben zu konvertieren. Aber wenn Sie es tatsächlich ausführen, tut es nichts. Lassen Sie uns etwas mehr Code hinzufügen:
for (Integer i : integers) {
// nothing to do
}
Jetzt schreibt es die Eingänge aus!
Das ist, weil die Lists.transform()
Methode nicht tatsächlich die Umwandlung durchführt, aber eine speziell gestaltete Klasse zurückgibt, die nur die Werte berechnet, wenn sie benötigt werden.
Bonus Beweis, dass alles gut funktioniert: Wenn wir die leere Schleife entfernt und ersetzt durch z. nur integers.get(1);
, würde es tatsächlich nur die Nummer 2
ausgeben. Wenn Sie mehrere Methoden miteinander verketten möchten, gibt es immer FluentIterable
. Dies ermöglicht es Ihnen, den Java 8 Stream-ähnlichen Stil zu programmieren.
Goldman Sachs Sammlungen
Während Guava in der Regel das Richtige standardmäßig funktioniert und arbeitet mit JDK-Klassen, manchmal müssen Sie etwas komplexer. Hier kommen die Kollektionen von Goldman Sachs ins Spiel. GS-Kollektionen geben Ihnen viel mehr Flexibilität und Kraft, indem Sie ein komplettes Drop-In-Kollektions-Framework mit allem haben, von dem Sie nur träumen können. Faulheit ist nicht standardmäßig, aber kann leicht erreicht werden:
FastList<String> strings = FastList.newListWith("1", "2", "3");
LazyIterable<Integer> integers = strings.asLazy().collect(new Function<String, Integer>() {
@Override
public Integer valueOf(String string) {
System.out.println(string);
return Integer.valueOf(string);
}
});
Auch hier tut nichts. Aber:
for (Integer i : integers) {
// nothing to do
}
gibt plötzlich alles aus.
P.S. In der realen Welt, wenn ich eine 'List' in eine 'List ' konvertieren müsste, würde ich ['Ints.stringConverter()'] (http://docs.guava-libraries.googlecode.com) verwenden /git-history/release/javadoc/com/google/common/primitives/Ints.html#stringConverter%28%29) als transformierende Funktion. –