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()))
真的很难看,有没有更好的方法呢?
答案 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的提交者。