gpt4 book ai didi

java - 为什么 stream sorted() 无法推断我的类型?

转载 作者:行者123 更新时间:2023-11-30 10:46:13 25 4
gpt4 key购买 nike

我正在阅读 this article并尝试对文本文件中的一些单词进行计数,发现我无法像文章的 list 1 中显示的那样进行反向排序。

我有一些有效的代码:

public class WordCounter {
public static final PrintWriter out = new PrintWriter(System.out, true);

public static void main(String... args) throws IOException {
//The need to put "", in front of args in the next line is frustrating.
try (Stream<String> lines = Files.lines(Paths.get("", args))) {
lines.parallel()
.map(l -> l.toLowerCase().replaceAll("[^a-z\\s]", "").split("\\s"))
.flatMap(Arrays::stream)
.filter(s -> !s.isEmpty())
.collect(Collectors.groupingBy(
Function.identity(), Collectors.counting()))
// Sort Map<K,V> Entries by their Integer value descending
.entrySet().parallelStream()
// MY QUESTION IS ABOUT THIS METHOD:
.sorted(
Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder()))
// --------------------------------- //
.forEachOrdered(e -> out.printf("%5d\t%s\n", e.getValue(), e.getKey()));
}
out.close();
}
}

所以这篇文章会建议行:

.sorted(Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder()))

可以写成:

.sorted(Comparator.comparing(Map.Entry::getValue).reversed())

尽管如此,Java 编译器会提示:

Error:(46, 49) java: invalid method reference non-static method getValue() cannot be referenced from a static context

这两个 comparing 方法签名具有完全相同的第一个参数和静态范围,但前者有效,而后者提示 getValue 是非静态的。

我最初的想法是把它写成:

.sorted(Map.Entry.comparingByValue())

它编译并运行但没有反转。或者:

.sorted(Map.Entry.comparingByValue().reversed())

再次无法编译,给出错误信息:

Error:(48, 62) java: incompatible types: java.util.Comparator<java.util.Map.Entry<java.lang.Object,V>> cannot be converted to java.util.Comparator<? super java.util.Map.Entry<java.lang.String,java.lang.Long>>

好的,那应该是:

.sorted(Map.Entry.<String, Long>comparingByValue().reversed())

哪个有效。

我似乎看不出如何在我的“可以写成”行中为 Map.Entry::getValue 表单提供类似的通用类型规范。

最佳答案

至于为什么会发生这种情况:虽然类型推断在 Java 8 中有了突飞猛进的发展,但如果将返回值分配给某些东西,它仍然只会使用返回目标类型。

在 Java 7 中,我们只能在赋值上下文中使用它(使用 = )并且它有点笨拙。在 Java 8 中,它不那么笨重,我们可以在调用上下文中使用它(作为方法参数传递,将其分配给形式参数)。

所以我的理解是,如果方法调用没有在赋值上下文或调用上下文中使用,目标类型推断就会关闭,因为它不再是多边形表达式( 15.12 , 18.5.2 )。 JLS 如是说。

简而言之,目标类型推断仅在返回值是:

  • 使用= 直接分配给一个变量, 如 v = foo(); .
  • 直接传递给方法,如bar(foo()) .

一旦你链接了一个方法调用,比如v = foo().zap() , 它停止工作。


摘 self 的评论:

I can't seem to see how to give a similar generic type specification to the Map.Entry::getValue form though.

这将是 Map.Entry<String, Long>::getValue .

关于java - 为什么 stream sorted() 无法推断我的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36671413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com