2014-12-12 11 views
5

Ich mag die Idee von intermediate operations von Java8, wo alle Operationen gelten einmal, wenn ein terminal operation erreicht ist.Sammlung Zwischenoperationen Bibliothek in Java7

Ich frage, gibt es Bibliothek, die ich mit Java 7 verwenden kann, die es mir ermöglichen, ein solches Verhalten zu erreichen.

Hinweis:
Ich verwende commons-collections4 abhol Operationen, wie forAllDo, so dass es möglich ist, es für einen solchen Fall zu bedienen? (Zwischen vs Terminalbetrieb)

Antwort

9

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.

+4

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. –