当前位置: 首页 > 面试题库 >

如何在Scala中使用Java Lambda

华修永
2023-03-14
问题内容

我有以下代码:

source
    .mapValues(value -> value + " Stream it!!!")
    .print(Printed.toSysOut());

如您所见,mapValues期望使用lambda表达式

现在,我正在使用Java库,但是该应用程序是用Scala编写的。如何将Scala lambda传递给Java代码?

我尝试了以下方法:

source
  .mapValues(value => value + "hello")
  .print(Printed.toSysOut)

但是编译器抱怨:

[error]   (x$1: org.apache.kafka.streams.kstream.Printed[String,?0(in value x$1)])Unit <and>
[error]   (x$1: org.apache.kafka.streams.kstream.KeyValueMapper[_ >: String, _ >: ?0(in value x$1), String])Unit <and>
[error]   (x$1: String)Unit
[error]  cannot be applied to (org.apache.kafka.streams.kstream.Printed[Nothing,Nothing])
[error]       .print(Printed.toSysOut)
[error]        ^
[error] two errors found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 2 s, completed Nov 19, 2017 7:53:44 PM

问题答案:

错误消息列出了print支持的参数类型。其中之一是:

org.apache.kafka.streams.kstream.Printed[String,?0(in value x$1)]

从错误消息中,您可以看到您提供Printed.toSysOut了以下类型:

org.apache.kafka.streams.kstream.Printed[Nothing,Nothing]

根据Kafka 1
javadoc
Printed在Kafka
1.1中不存在),toSysOut定义为:

public static <K,V> Printed<K,V> toSysOut()

因此,答案是Scala进行推断KV具有类型Nothing。您需要显式提供类型。

以下可能会起作用:

source
  .mapValues[String](value -> value + " Stream it!!!")
  .print(Printed.toSysOut[String,String])


 类似资料:
  • 问题内容: 我正在尝试使用字符串方法。但是,如果我将%1,%2等放置在字符串中,则会抛出java.util.UnknownFormatConversionException,指向一个令人困惑的Java源代码片段: 从中我了解到 char是被禁止的。如果是这样,那么我应该对参数占位符使用什么? 我使用Scala 2.8。 问题答案: 尽管所有先前的回答都是正确的,但它们都是Java语言。这是一个Sc

  • 问题内容: 我正在使用Scala 2.8中的JSON类中的构建来解析JSON代码。由于最小化依赖性,我不想使用Liftweb或其他任何一种。 我这样做的方法似乎势在必行,是否有更好的方法可以做到? 问题答案: 这是一个基于提取器的解决方案,它将进行类转换: 在for循环的开始,我人为地将结果包装在一个列表中,以便在最后生成一个列表。然后在for循环的其余部分中,我将使用生成器(使用)和值定义(使用

  • 问题内容: 如何引用一个Java包,其中包含名称如Scala中的com.example.object的对象? Scala将对象视为保留字并抱怨。 问题答案: 将保留字放在反引号中,如下所示:

  • 我想在Scala 3/sbt项目中使用Gatling。 问题是Gatling打包它的库没有Version-Postfix。所以我认为对于任何这样做的Scala库来说,你都有同样的问题。 我尝试了一些方法,例如: > 给予: 和 > 根据Scala 3文档: 给予: 有办法吗?

  • Junit5引入了@BeforeAll来表示应在当前测试类中的所有测试之前执行带注释的方法。但是它要求方法是静态的。 我的 Scala 测试套件中有以下结构: 以及其他测试类别: 所以我希望< code > codeNeedeForAllTests 在所有测试之前被调用,但是问题是< code>@BeforeAll要求方法是静态的,为此我需要将codeNeedeForAllTests作为对象,以便

  • 问题内容: 我有一个Scala对象,需要在Java类中使用。 这是Scala对象 如何在Java中使用此Scala对象? 到目前为止,我已经尝试了以下操作,但未成功(编译错误): //返回一个没有用的字符串,因为我想要实际的Person对象 问题答案: 编辑 :一个工作示例(我检查过,它可以编译并工作):Scala: Java对应项: