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

为什么它不识别asScala方法?

程化
2023-03-14

我有以下代码,没有编译:

import akka.NotUsed
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors
import akka.pattern.FutureRef
import akka.stream.scaladsl._
import akka.stream.typed.scaladsl.ActorMaterializer
import org.apache.kafka.clients.admin._
import scala.jdk.FutureConverters._


import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration

object KafkaDetectorActor {

  val create: Behavior[NotUsed] = Behaviors.setup { context =>
    implicit val system = context.system
    implicit val materializer = ActorMaterializer()
    implicit val dispatcher = context.system.dispatchers


    Behaviors.same
  }

  private def health(server: String)(implicit executor: ExecutionContext): Future[Boolean] = {
    val props = new Properties
    props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, server)
    props.put(AdminClientConfig.CONNECTIONS_MAX_IDLE_MS_CONFIG, "10000")
    props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, "5000")

        AdminClient
          .create(props)
          .listTopics()
          .names()
          .asScala

  }

其中name返回KafkaFuture[java.util.Set[String]]

它不识别< code>asScala方法。将导入< code > Scala . JDK . future converters . _ 库。我做错了什么?

共有2个答案

后化
2023-03-14

正如阿列克谢·罗马诺夫建议的,你可以直接转换到Scala的未来:

   implicit class KafkaFutureEx[T](kafkaFuture: KafkaFuture[T]) {
    val p = Promise[T]
    kafkaFuture.whenComplete { (value, throwable) =>
      {
        if (throwable != null) {
          p.failure(throwable)
        } else {
          p.success(value)
        }
      }
    }

    def toScalaFuture = p.future
  }
唐海阳
2023-03-14

scala.jdk.FutureConvertersCompletableFuture上运行,所以尝试首先将KafkaFuture转换为CompletableFuture,就像这样

  implicit class KafkaFutureToCompletableFuture[T](kafkaFuture: KafkaFuture[T]) {
    def toCompletableFuture: CompletableFuture[T] = {
      val wrappingFuture = new CompletableFuture[T]
      kafkaFuture.whenComplete((value, throwable) => {
        if (throwable != null) {
          wrappingFuture.completeExceptionally(throwable)
        }
        else {
          wrappingFuture.complete(value)
        }
      })
      wrappingFuture
    }
  }

现在我们可以调用toCompletableFuture.asScala。例如,

import scala.jdk.FutureConverters._
KafkaFuture.completedFuture(42).toCompletableFuture.asScala.foreach(println)

产出42.如果您的情况,请尝试

AdminClient
  .create(props)
  .listTopics()
  .names()
  .toCompletableFuture
  .asScala
 类似资料:
  • 对于这个程序,它要求用户输入他们的全名。然后,它通过在名字和姓氏之间的空格处将它们分开来排序名字和姓氏。但是,indexOf()无法识别空格并且只返回-1。为什么?谢谢。 以下是PracticeIt的提示: 编写一个名为process Name的方法,该方法接受控制台的Scanner作为参数,并提示用户输入他或她的全名,然后以相反的顺序打印名称(即姓氏、名字)。您可以假设只会给出名字和姓氏。您应该

  • 有25种类型的空白。在下面的代码中显示,25种类型中有4种在Java中不被视为空白。为什么? 参考-https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/character.html#IsWhitespace(char)

  • 这是一段代码 这将向控制台提供以下结果: 这意味着第一个中的链被识别为空链。 另一方面,Reactor具有以下类MonoEmpty,该类由Mono返回。empty()方法。除此之外,该方法还包括以下内容: 没有发出任何项,但我用方法发出了类型化对象。 对此有何解释?

  • 在PhpStorm的最新版本(2018年)中,所以它在项目的2017年版本中,我有一个名为<code>User_model的文件。php</code>,并且PhpStorm不将其识别为php文件,而是将其识别成纯文本文件。 但它并不总是如此;我最近才注意到。 我意识到问题出在文件名中()。因为只要我更改文件名(例如,),该文件就会立即被识别为php文件。 是不是(< code>User_model

  • 我用LWJGL编写了一个简单的程序。问题是每次我尝试运行应用程序时,都会遇到这个错误: 该错误具有误导性,因为我确实调用了< code > glfwMakeContextCurrent(window)和< code > GL . create capabilities()。 我将错误跟踪到似乎当我删除这个和行时,应用程序将运行。 我不理解的是为什么会发生这种情况,因为我在中确实有一个GLFW 3.

  • 问题指出: 创建一个具有长度和宽度双属性的矩形类。默认构造函数应该将这些属性设置为1。提供计算矩形周长和面积的方法,以及两个数据字段的访问器和赋值器。length和width的mutator方法应该验证传入的数字是否大于0.0且小于20.0——如果不符合这些标准,就不应该更改字段的值。 在同一文件中编写一个驱动程序类来测试您的矩形类。它应该提示用户输入矩形的长度和宽度,然后打印出矩形的面积和周长。