2016-04-23 10 views
6

Ich lese bereits this verwandten Post. Wenn es um String-Operationen geht, scheinen Streams eine große Menge an Zeremonien anzulocken. Wenn Sie einen String als Zeichenstrom analysieren möchten, für den Sie möglicherweise einige Operationen ausführen möchten, müssen Sie diese zuerst in IntStream konvertieren, dann auf Object und anschließend auf umwandeln und schließlich die char in String umwandeln dann gib es zurück.Sind Java 8 Streams nicht dazu gedacht, mit Zeichen und Strings verwendet zu werden?

Und Leute sagen, Imperativ Stil Programmierung hat eine Zeremonie Overhead. Bitte korrigieren Sie mich, wenn ich das komplett falsch mache. Ich beabsichtige nicht, herumzuspielen, sondern Java-Streams besser zu verstehen, weil ich sie im Allgemeinen schätze.

// Simple method which encrypts all chars in a string 
String input = "Hel!lo"; 

String result = input.chars()        // Need to convert into an IntStream 
     .mapToObj(e -> Character.toUpperCase((char) e))  // Need to map to Object (!) and then cast to char 
     .map(CryptoMath::encryptChar)      // Calling the encryption 
     .map(String::valueOf)        // Need to cast to String again... 
     .collect(joining(""));        // Finally done 

System.out.println(result); 
+1

Sie können das 'char' einfach als' int' behandeln. Aber dieses Problem ist wirklich ein Vermächtnis des ganzen Java primitiven Typenproblems. –

+0

Nun, wenn ich das tue, muss ich jede Methode mit char-Parametern ändern, um stattdessen zu nehmen, was meiner Meinung nach Code-Geruch ist. Auf welches Problem bezogen auf Primitive beziehen Sie sich? Sie haben einen Link? – AdHominem

+1

Nur Google es. Sie können Generics mit Primitiven nicht verwenden. Sie mussten den gleichen Code für "Stream ", "IntSteam" ** und "LongStream" schreiben. Sie haben sich entschieden, keinen 'CharStream' zu erstellen. Dies ist ein Anker, der modernes Java zurückhält; und nicht einer, der abgeschnitten werden kann. –

Antwort

3

Wenn Sie auf Unicode-Codepunkten anstelle von Zeichen arbeiten können, wird es ein bisschen weniger umständlich als Betrieb auf char:

String input = "Hel!lo"; 

String result = input.codePoints() 
        .map(Character::toUpperCase) 
        .collect(StringBuilder::new, 
           StringBuilder::appendCodePoint, 
           StringBuilder::append) 
        .toString(); 

System.out.println(result); 

Es gibt keine Boxen erforderlich, keine Konvertierung in einem String an der Stelle der Sammlung, und Sie werden weniger wahrscheinlich durch Ersatzpaare in Ihren Eingabedaten stolpern. Eine dieser netten Gelegenheiten, bei denen es weniger schmerzhaft ist, etwas zu implementieren, das eine breitere Auswahl an Eingaben ermöglicht.

+1

-1 Dies ist ein Vorschlag aus dem verwandten Post, dass das OP bereits gelesen hatte und keine befriedigende Antwort gefunden hat. Sie sollten den Vorschlag in dem anderen Beitrag zitieren und erklären, warum es eine Antwort für das OP gibt. –

+0

Hätte ich diesen Kommentar in dem verwandten Post bemerkt, hätte ich es vielleicht getan, aber zu meiner Diskreditierung habe ich es überflogen und es verpasst. Zu meiner Verteidigung handelte es sich eher um einen kleinen Kommentar als um eine Antwort, und es wurde kein Codebeispiel bereitgestellt, das deutlich macht, wie viel einfacher es zu verwenden wäre. Man kann nie wissen, wenn man es mit einem klaren Beispiel wie oben beschrieben ausdrückt, könnte das OP sagen "eigentlich wird das für mich funktionieren", vorausgesetzt, dass er im Gegensatz zu mir diesen Kommentar aus dem verlinkten Post gesehen und verworfen hat. Wenn nicht, ist er vollkommen frei, es nicht als Antwort zu akzeptieren. –

1

Mit Eclipse Collections können Sie die fehlenden Teile in der Java-Standardbibliothek ergänzen. Folgendes funktioniert unter Verwendung von CharAdapter, unter der Annahme CryptoMath.encryptChar() gibt char zurück.

String result = CharAdapter.adapt(input) 
     .collectChar(Character::toUpperCase) 
     .collectChar(CryptoMath::encryptChar) 
     .makeString(""); 

Hinweis: Ich bin ein Committer für Eclipse Collections.