Scala 12.x и Java 11 `String.lines`, как заставить неявное преобразование в цепочечный вызов? - PullRequest
0 голосов
/ 15 октября 2018

Описание проблемы Scala StringOps предоставляет метод lines, который возвращает Iterator[String].Java 11 добавлена ​​lines() с типом возвращаемого значения java.Stream[String].

В цепочечном вызове метода, подобном

val text: String
text.lines.foldLeft("")(_ + _)

, код больше не будет компилироваться и выдавать исключение, что foldLeft не являетсяопределенный на java.Stream [String].Насколько я понимаю, неявное разрешение больше не применяется, так как метод линий теперь уже найден в java.String.

Как я могу выразить, что я хочу, чтобы неявное применение (то есть без паренов) не выполнялосьjava.String.lines ()

Дополнительная информация

  • Я нашел linesIterator, но устарел.
  • Понижение рейтингавариант, но есть ли способ обойти это.
  • val text : StringOps выглядит очень некрасиво, но решил, но я недоволен этим решением

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы можете заставить Scala использовать неявное преобразование в StringOps, которое будет использовать старый метод lines:

(text: StringOps).lines.foldLeft("")(_ + _)
0 голосов
/ 15 октября 2018

Конфликт между StringOps#lines и jdk11 java.lang.String#lines - это ошибка в Scala, см. Проблему 11125 .

Исправление этой ошибки - отменить linesIterator,что было сделано в 2.12.7.

Welcome to Scala 2.12.7 (OpenJDK 64-Bit Server VM, Java 11).

scala> "a".lines
res0: java.util.stream.Stream[String] = java.util.stream.ReferencePipeline$Head@2df259d0

scala> "a".linesIterator
res1: Iterator[String] = <iterator>
...