使用 java lambda 以降序排列字数
Word count in descending order using java lambdas
我有一个字符串,我想按降序对其进行字数统计。我的代码如下:
String[] line = "some text some spaces".split(" ");
Map<String, Long> map1 = Arrays.stream(line).stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Map<String, Long> map2 = map1.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed()).collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(), (v1, v2) -> v2, LinkedHashMap::new));
以上按单词出现次数的降序排列给出了字数统计。是否可以只执行一次此操作,我的意思是将第 2 行和第 3 行合并为一条。这将要求我只创建一个流。
在此先感谢您。
我不认为这是可能的。由于 Collect 是一个终端操作,您不能在调用终端操作后重用该流。
以下是来自以下文章的一些信息:
Stream operations are either intermediate or terminal. Intermediate operations return a stream so we can chain multiple intermediate operations without using semicolons. Terminal operations are either void or return a non-stream result.
Java 8 streams cannot be reused. As soon as you call any terminal operation the stream is closed.
您可以阅读这篇文章article了解更多详情。
这是一种方式(它确实创建了两个流并合并了两行代码):
Map<String, Long> map = Arrays.stream("some text some spaces".split(" "))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(),
(v1, v2) -> v2, LinkedHashMap::new));
System.out.println(map); // This prints: {some=2, spaces=1, text=1}
我有一个字符串,我想按降序对其进行字数统计。我的代码如下:
String[] line = "some text some spaces".split(" ");
Map<String, Long> map1 = Arrays.stream(line).stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Map<String, Long> map2 = map1.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed()).collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(), (v1, v2) -> v2, LinkedHashMap::new));
以上按单词出现次数的降序排列给出了字数统计。是否可以只执行一次此操作,我的意思是将第 2 行和第 3 行合并为一条。这将要求我只创建一个流。
在此先感谢您。
我不认为这是可能的。由于 Collect 是一个终端操作,您不能在调用终端操作后重用该流。
以下是来自以下文章的一些信息:
Stream operations are either intermediate or terminal. Intermediate operations return a stream so we can chain multiple intermediate operations without using semicolons. Terminal operations are either void or return a non-stream result.
Java 8 streams cannot be reused. As soon as you call any terminal operation the stream is closed.
您可以阅读这篇文章article了解更多详情。
这是一种方式(它确实创建了两个流并合并了两行代码):
Map<String, Long> map = Arrays.stream("some text some spaces".split(" "))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(),
(v1, v2) -> v2, LinkedHashMap::new));
System.out.println(map); // This prints: {some=2, spaces=1, text=1}