本文介绍了将java.util.stream.Stream转换为Scala Stream的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我知道如何使用Java库,并且可以编写一些循环来完成我所需的工作,但问题是更多的,为什么 scala.collection.JavaConverters中没有任何内容或 scala.collection.JavaConverstions 将 java.util.stream.Stream 转换为 scala.collection.immutable.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(它)其他 Stream() loop(path_it)} 解决方案 JavaConverters 和 JavaConversions 的当前版本不 Java 8,其中 java.util.stream.Stream ,是在2014年3月发布,而Scala 2.11.0是于2014年4月正式发布。因此,没有时间更改Scala 2.11计划以增加与Java 8功能的更好集成。实际上,Scala 2.12计划对Java 8提供更好的支持(请参见此处的路线图,以及本 Adrian Moors的演讲)。 但是无论如何,这里有 scala-java8-compat ,用于Scala的Java 8兼容性工具包,并且有还 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._ 对象Foo { def streamFiles(path:Path):Stream [Path] = { Files.newDirectoryStream(path).iterator()。asScala.toStream } } 但是,如果您仍然要将 java.util.stream.Stream 转换为Scala Stream,请添加 scala-java8-compat 版本0.8.0-RC3或更高版本(您可能需要也将新的解析器添加到您的版本中),然后执行类似的操作: 导入scala。 compat.java8.StreamConverters._ 值数:java.util.List [Int] = java.util.Arrays.asList(1、2、3)numbers.stream()。toScala [Stream] I know how I can use the Java libraries, and I can write some loops that do the stuff I need for me, but the question is more, why is there nothing in scala.collection.JavaConverters or scala.collection.JavaConverstions to convert a java.util.stream.Stream to a scala.collection.immutable.Stream?I would like to do something like this:def streamFiles(path: Path): Stream[Path] = { Files.newDirectoryStream(path).asScala}But instead I have to write something like this: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)} 解决方案 The current version of JavaConverters and JavaConversions don't offer conversions between Java Stream and Scala Stream because of differences at roadmaps.Java 8, the version where java.util.stream.Stream was introduced, was released at Mar 2014 while Scala 2.11.0 was officially released at Apr 2014. So there was no time to change Scala 2.11 plans to add better integration with Java 8 features. In fact, better support to Java 8 is planned for Scala 2.12 (see the roadmap here and also this presentation from Adrian Moors).But anyway, there is scala-java8-compat, "a Java 8 compatibility kit for Scala" and there is also experimental support in Scala 2.11.Looking at your code, there is a relevant issue: Files.newDirectoryStream returns a DirectoryStream which is not a sub interface of java.util.stream.Stream, but an Iterable instead. So, what you need is a way to convert an Iterable to a Scala Stream, if this is what you really want, and your code should be like:import java.nio.file.Pathimport java.nio.file.Filesimport scala.collection.JavaConverters._object Foo { def streamFiles(path: Path): Stream[Path] = { Files.newDirectoryStream(path).iterator().asScala.toStream }}But if you still want to convert a java.util.stream.Stream to Scala Stream, add scala-java8-compat version 0.8.0-RC3 or newer to your project (you may need to add a new resolver to your build too) and then do something like:import scala.compat.java8.StreamConverters._val numbers: java.util.List[Int] = java.util.Arrays.asList(1, 2, 3)numbers.stream().toScala[Stream] 这篇关于将java.util.stream.Stream转换为Scala Stream的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!