你说Stream
- 我想你的意思是Java的8
这里是你会怎么做:
public Map<Character, Integer> countOccurs(final char[] input) {
return countOccurs(new String(input));
}
public Map<Character, Integer> countOccurs(final String input) {
return input.chars().
collect(
HashMap::new,
(m, c) -> m.merge((char) c, 1, Integer::sum),
HashMap::putAll
);
}
的想法是,我们采取的char
值的IntStream
在String
作为int
。然后我们collect()
这个IntStream
到Map
;这就像一个函数式语言中的操作foldLeft
。 Map.merge
方法采用一个键和一个值和一个lambda合并一个现有的值和新的值,如果已经在Map
- 我们通过Integer::sum
将两个值相加在一起。
体操与int
和char
和Character
是遗留的Java问题。在新的Java 8 API中没有原始CharStream
,所以我们必须使用IntStream
- 然后我们必须将int
转换为char
,然后它将被自动装箱到Character
。
用法示例:
System.out.println(countOccurs("abbccddde"));
输出:
{a=1, b=2, c=2, d=3, e=1}
然后,如果您要筛选,你可以简单地做计数:
final Map<Character, Integer> count = countOccurs("abbccddde");
count.entrySet().stream().
filter(e -> e.getValue() > 1).
forEach(System.out::println);
,这将给你:
b=2
c=2
d=3
如果你想在逻辑上类似于你的LINQ例如东西,那么这个将工作:
public Collection<? extends Map.Entry<Character, Integer>> countOccurs(final String input) {
return input.chars().boxed().
collect(groupingBy(identity())).entrySet().stream().
filter(e -> e.getValue().size() > 1).
map(e -> new AbstractMap.SimpleEntry<>((char)(int)e.getKey(), e.getValue().size())).
collect(toList());
}
但它真的很丑陋,需要一个中间集合。
P.S.原谅格式化,我不确定如何格式化长行Stream
操纵。我确信很快就会有风格指引。
对字符串中的字符进行排序,并统计每个字符的出现次数。 – ionutioio