Преобразовать условие Scala в предикат Java - PullRequest
2 голосов
/ 05 мая 2019

Я использую библиотеку Java fabric8io для работы с Kubernetes в Scala. Я хотел бы использовать функцию waitUntilCondition, которая получила java.util.Predicate в качестве первого аргумента. Однако в Scala предикат формируется в другой форме. И я получаю ошибку компиляции:

Type mismatch, expected: Predicate[Pod], actual: Nothing => Any

Как я могу определить этот предикат в Scala? Вот код, который я использовал:

client.pods()
    .inNamespace("default")
    .withName("app-driver")
    .waitUntilCondition(condition => condition.getStatus().getPhase().equals("Running"), 15, TimeUnit.MINUTES)

Ответы [ 2 ]

4 голосов
/ 05 мая 2019

Scala 2.12, кажется, прекрасно компилируется из коробки на моей машине, однако в Scala 2.11 мне пришлось использовать scala-java8-compat asJavaPredicate, как предложено @KrzysztofAtlasik (просто ввод типа не работал для меня).

Если обновление до Scala 2.12 или импорт scala-java8-compat недоступны, попробуйте создать экземпляр Predicate[Pod] и переопределить метод test, например

waitUntilCondition(
  new Predicate[Pod] { def test(pod: Pod): Boolean = pod.getStatus.getPhase.equals("Running") }, 
  15, 
  TimeUnit.MINUTES
)
3 голосов
/ 05 мая 2019

Похоже, что компилятор не может правильно определять типы. Может быть, просто попытаться добавить тип явно?

waitUntilCondition(pod: Pod => pod.getStatus().getPhase().equals("Running"), 15, TimeUnit.MINUTES)

Вы также можете попробовать использовать scala-java8-compat :

import scala.compat.java8.FunctionConverters._


waitUntilCondition(asJavaPredicate(pod => pod.getStatus().getPhase().equals("Running")), 15, TimeUnit.MINUTES)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...