当前位置: 首页 > 知识库问答 >
问题:

为什么Java不能typecheck这段代码?

乌俊健
2023-03-14

我有一些流处理代码,它接受一个单词流并对它们执行一些操作,然后将它们简化为一个映射,其中包含单词作为键,单词的出现次数作为long值。为了代码的简洁性,我使用了jOOL库的seq类,其中包含许多有用的快捷方法。

item.setWordIndex (
        getWords (item)                      // returns a Seq<String>
              .map (this::removePunctuation) // String -> String
              .map (stemmer::stem)           // String -> String
              .groupBy(str -> str, Collectors.counting ()));

类型MyClass中的方法setwordindex(map ) 不适用于参数(map )
type函数未定义此处适用的标识(String)

为什么function::identity的行为与str->str有任何不同,我(也许是天真地)认为它是直接等效的,为什么编译器在使用它时不能处理它?

(是的,我知道我可以通过将以前的map应用程序移到groupby操作中来删除标识函数,但我发现这样的代码更清晰,因为它更直接地遵循应用程序逻辑)

共有1个答案

鲁才艺
2023-03-14

您需要function.identity()(它返回函数 ),而不是function::identity(它匹配SAM类型供应商 > )。

下面的代码编译得很好:

static String removePunctuation(String x) { return x; }
static String stem(String x) { return x; }

// ...

final Map<String, Long> yeah = Seq.of("a", "b", "c")
        .map(Test::removePunctuation)
        .map(Test::stem)
        .groupBy(Function.identity(), Collectors.counting());
 类似资料:
  • 预计此函数将无法typeCheck。然而,没有解释发生这种情况的原因。在GHCI中试用时,我得到了以下输出: 为什么会出现这种情况?

  • 在方法或类范围内,下面的行编译(带有警告): 在类作用域中,变量获取其默认值,以下给出未定义引用错误: 这难道不是第一个应该以相同的未定义引用错误结束吗?或者第二行应该编译?或者我错过了什么?

  • 我想了解为什么一段代码不会抛出NullPointerException。 请考虑以下代码: 方法被重复调用,同时以下代码在单独的线程中运行: 只有一个实例。 从不引发NullPointerException。 但是,当方法暂停时,即使暂停0毫秒,也会按预期引发NullPointerException: 我的理解是,在理论上,在检查和调用之间存在竞争条件。在实践中,如果不引入暂停(即从后续方法调用中

  • (下面是完整的代码)我刚刚交了一个课堂实验,在那里我们必须做一个描述某本书的课堂。我不知道怎么做两件事。1.如果有人为“页面”或“SuggestedMetalPrice”输入的值小于零,则该值必须设置为零。在该代码中,即使值为正,该值也设置为0。在: 如果我将第二个“0”设置为不同的数字,比如说: 那么你输入的“页面”的值将是1。但是如果你输入的值是负数,它不应该只有1吗?我不明白我做错了什么。

  • 我正在尝试插入: 在: 但我不工作... 我试过: 为什么??

  • 因此,下面的代码,从txt文件中取序列号作为参数,在我的计算机上正常工作。每个数字都写在一行上。下面是代码: 但它在CodeEval中不起作用。站点编译器是这么说的: Fontconfig错误:无法加载默认配置文件线程“main”java.awt.HeadLessException:未设置X11显示变量,但此程序执行了需要它的操作。在java.awt.GraphicsEnvironment.Che