2016-07-20 2 views
3

Я знаю, как я могу использовать библиотеки Java, и я могу написать несколько циклов, которые делают то, что мне нужно, но вопрос в том, почему в нем нет ничего scala.collection.JavaConverters или scala.collection.JavaConverstions для преобразования java.util.stream.Stream в scala.collection.immutable.Stream?Convert java.util.stream.Stream to Scala Stream

Я хотел бы сделать что-то вроде этого:

def streamFiles(path: Path): Stream[Path] = { 
    Files.newDirectoryStream(path).asScala 
} 

Но вместо этого я должен написать что-то вроде этого:

def streamFiles(path: Path): Stream[Path] = { 
    val path_it : java.util.Iterator[Path] = Files.newDirectoryStream(path).iterator() 
    def loop(it: java.util.Iterator[Path]): Stream[Path] = 
    if(it.hasNext) 
    it.next #:: loop(it) 
    else 
     Stream() 
    loop(path_it) 
} 
+0

Ваш вопрос остается неясным. Какой поток (Java 8 или Scala)? В чем проблема? Что вы уже делали? – marcospereira

+0

преобразование потока Java8 в поток Scala. Так и то и другое. Я думал, это будет ясно. – Arne

+0

Это не так. Пожалуйста, перепишите свой вопрос, желательно с некоторым кодом, связанным с тем, что вы хотите достичь. – marcospereira

ответ

8

Текущая версия JavaConverters и JavaConversions не предлагают преобразования между Java Stream и Scala Stream из-за различий в дорожных картах.

Java 8, версия, в которой java.util.stream.Stream была введена, была released at Mar 2014, а Scala 2.11.0 была officially released at Apr 2014. Таким образом, не было времени, чтобы изменить Scala 2.11, чтобы добавить лучшую интеграцию с функциями Java 8. Фактически, лучшая поддержка Java 8 запланирована для Scala 2.12 (см. roadmap here, а также это presentation from Adrian Moors).

Но в любом случае есть scala-java8-compat, «набор для совместимости с Java 8 для Scala», а также есть experimental support in Scala 2.11.

Глядя на ваш код, есть соответствующий вопрос: Files.newDirectoryStream возвращает DirectoryStream, который не является суб интерфейс java.util.stream.Stream, но Iterable вместо этого. Итак, что вам нужно, это способ преобразования Iterable в Scala Stream, если это то, что вы действительно хотите, и ваш код должен быть как:

import java.nio.file.Path 
import java.nio.file.Files 

import scala.collection.JavaConverters._ 

object Foo { 
    def streamFiles(path: Path): Stream[Path] = { 
    Files.newDirectoryStream(path).iterator().asScala.toStream 
    } 
} 

Но если вы все еще хотите, чтобы преобразовать java.util.stream.Stream в Scala поток, добавить scala-java8-compat версии 0.8.0-RC3 или более поздней версии для вашего проекта (возможно, потребуется add a new resolver to your build too), а затем сделать что-то вроде:

import scala.compat.java8.StreamConverters._ 

val numbers: java.util.List[Int] = java.util.Arrays.asList(1, 2, 3) 
numbers.stream().toScala[Stream] 
+0

Большое спасибо, это был действительно хороший и подробный ответ, я больше этого не ожидал. – Arne