Java 8 Streams и Scala Streams концептуально разные вещи; Java 8 Stream не является коллекцией, поэтому обычный конвертер коллекции не будет работать. Вы можете использовать scala-java8-compat (github) библиотеку, чтобы добавить метод toScala
к Java Streams:
import scala.compat.java8.StreamConverters._
import java.nio.file.{ Files, Path, Paths }
val scalaStream: Stream[Path] = Files.walk(Paths.get(".")).toScala[Stream]
Вы не можете использовать это преобразование (Java-> Scala) от Java, так что если вы должны сделать это из Java, это легче (но все-таки неудобно), чтобы просто запустить поток и построить Scala класс, сформированный с учетом способностей учащихся самостоятельно (что вышеупомянутая библиотека делает под капотом):
import scala.collection.immutable.Stream$;
import scala.collection.mutable.Builder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
final Stream<Path> stream = Files.walk(Paths.get("."));
final Builder<Path, scala.collection.immutable.Stream<Path>> builder = Stream$.MODULE$.newBuilder();
stream.forEachOrdered(builder::$plus$eq);
final scala.collection.immutable.Stream<Path> result = builder.result();
Однако оба способа полностью потреблять Java Поток, поэтому вы не получаете преимущества от ленивой оценки, преобразовывая ее в поток Scala и, возможно, просто c переведите его прямо в вектор. Если вы просто хотите использовать синтаксис литерала функции Scala, существуют разные способы достижения этого. Вы можете использовать ту же библиотеку, чтобы использовать преобразователи функции, аналогичный преобразователи коллекции:
import scala.compat.java8.FunctionConverters._
import java.nio.file.{ Files, Path, Paths }
val p: Path => Boolean = p => Files.isExecutable(p)
val stream: java.util.stream.Stream[Path] = Files.walk(Paths.get(".")).filter(p.asJava)
В качестве альтернативы, так как 2.11, Scala имеет экспериментальную поддержку типов SAM под -Xexperimental
флага. Это будет не экспериментально без флага в 2.12.
$ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
Type in expressions for evaluation. Or try :help.
scala> import java.nio.file.{ Files, Path, Paths }
import java.nio.file.{Files, Path, Paths}
scala> Files.walk(Paths.get(".")).filter(p => Files.isExecutable(p))
<console>:13: error: missing parameter type
Files.walk(Paths.get(".")).filter(p => Files.isExecutable(p))
^
scala> :set -Xexperimental
scala> Files.walk(Paths.get(".")).filter(p => Files.isExecutable(p))
res1: java.util.stream.Stream[java.nio.file.Path] = [email protected]
scala> Files.walk(Paths.get(".")).filter(Files.isExecutable)
res2: java.util.stream.Stream[java.nio.file.Path] = [email protected]
@NathanielFord может быть, есть тег для Java 8? –
Что вам нужно? В 2.12 вы можете 'stream.filter (x => something)'. –
@ som-snytt Мне нужно сначала преобразовать тип потока Java, прежде чем применять код Scala. – TeeKai