使用Java Lambdas以降序排列的单词数

时间:2018-08-08 02:00:31

标签: java java-8 word-count

我有一个字符串,我想按降序对单词进行计数。我有以下代码:

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行合并为一个。然后,这将需要我仅创建一个流。

非常感谢您。

2 个答案:

答案 0 :(得分:0)

这是一种方法(它确实创建了两个流并且确实合并了两行代码):

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}

答案 1 :(得分:-1)

我认为不可能。由于Collect是终端操作,因此调用终端操作后将无法重用流。

以下文章提供了一些信息:

  

流操作是中间操作或终端操作。中间操作返回一个流,因此我们可以链接多个中间操作而无需使用分号。终端操作无效或返回非流结果。

     

Java 8流不能重复使用。调用任何终端操作后,流就立即关闭。

您可以阅读此article以获得更多详细信息。