是否有一种优雅的方式将String转换为Stream <character>

时间:2017-12-23 05:16:09

标签: java java-8 java-stream

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)
                      ));
    }

这一行target.chars().boxed().map(c -> Character.valueOf((char) c.intValue()))真的很难看,有没有更好的方法呢?

3 个答案:

答案 0 :(得分:11)

也许你错过了这个:

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

chars()返回IntStream,您唯一需要做的就是通过强制转换将每一个映射到字符类型。

答案 1 :(得分:2)

如果你想要一个Stream<Character>,@ STaefi的回答肯定是可行的。

但是,让代码更短更容易理解的另一种方法是将字符表示为字符串然后你可以这样做:

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

答案 2 :(得分:1)

如果您愿意使用第三方库,则可以使用Eclipse Collections撰写以下内容。

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

这会将char值转换为Character个对象,然后为您提供Stream<Character>

如果您要计算String中的字符数,Bag是比Map更好的选择。在Eclipse集合中,HashBag是使用ObjectIntHashMap实现的。以下显示了如何计算字符串中的char值或Character对象。

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'));

CharBag不需要任何Character个对象或Integer值计数。

注意:我是Eclipse Collections的提交者。