2017-12-23 6 views
1
Map<Character, Integer> getMap(String target) { 
return target.chars().boxed() 
         .map(c -> Character.valueOf((char) c.intValue())) 
         .collect(Collectors.groupingBy(
          c -> c, 
          Collectors.reducing(0, c -> 1, Integer::sum) 
        )); 
    } 

diese Linie target.chars().boxed().map(c -> Character.valueOf((char) c.intValue())) wirklich hässlich ist, ist es eine bessere Art und Weise zu diesem?gibt es eine anmutige Art und Weise eine Zeichenfolge zu konvertieren zum Streamen <Character>

+0

Ich glaube nicht, dass es * zu * schlecht ist, aber du hast recht, es hat keinen Sinn, in 'Integer'-Objekte zu boxen und sie wieder auszupacken. –

+0

Die Zwischenoperation 'map()' ist nicht erforderlich, wenn 'groupingBy()' bereits eine Mapping-Funktion erwartet. – shmosel

Antwort

11

Vielleicht haben Sie diese verpasst haben:

Stream<Character> charStream = target.chars().mapToObj(i->(char)i); 

chars() Rückkehr der IntStream und das einzige, was Sie tun müssen, ist jedes mit dem Zeichentyp Karte durch Gießen.

2

@ STaefis Antwort ist definitiv der Weg zu gehen, wenn Sie eine Stream<Character> wollen.

jedoch eine andere Art und Weise Ihren Code kürzer und leichter zu folgen zu machen, ist die Zeichen als Zeichenfolgen darzustellen und dann können Sie tun:

Map<String, Integer> getMap(String target) { 
     return Arrays.stream(target.split("")) 
        .collect(Collectors.groupingBy(Function.identity(), 
            Collectors.summingInt(s -> 1))); 
} 
+0

Der mögliche Vorteil ist ...? –

+2

_Machen Sie Ihren Code kürzer und einfacher zu folgen_ wie in der Antwort angegeben. _readability_ ist genauso wichtig in der Programmierung. –

+2

'Collectors.reducing (...)' könnte durch 'Collectors.counting()' ersetzt werden, wenn eine 'Map ' ein akzeptabler Typ ist, der zurückgegeben werden soll. Wenn nicht, können Sie auch 'Collectors.summingInt (ch -> 1)' verwenden. –

1

Wenn Sie ein Drittanbieter-Bibliothek zu verwenden sind offen, Sie können folgendes mit Eclipse Collections schreiben.

Stream<Character> stream = 
    CharAdapter.adapt("aaabbc").collect(Character::valueOf).stream(); 

Dies wird die char Werte Character Objekte konvertieren und Sie dann einen Stream<Character> geben.

Wenn Sie die Zeichen in einer String zählen möchten, ist ein Bag eine bessere Wahl als ein Map. In Eclipse Collections wird HashBag mit einem ObjectIntHashMap implementiert. Im Folgenden wird gezeigt, wie Sie die char Werte oder Character Objekte in einem String zählen können.

CharBag charBag = 
     CharAdapter.adapt("aaabbc").toBag(); 

Bag<Character> characterBag = 
     CharAdapter.adapt("aaabbc").collect(Character::valueOf).toBag(); 

Assert.assertEquals(3, charBag.occurrencesOf('a')); 
Assert.assertEquals(3, characterBag.occurrencesOf('a')); 

Die CharBag wird keine Boxen von Character Objekte oder Integer Werte für Zählungen benötigen.

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

Verwandte Themen