将java.util.stream.Stream转换为Scala Stream [英] Convert java.util.stream.Stream to Scala Stream

查看:96
本文介绍了将java.util.stream.Stream转换为Scala Stream的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道如何使用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)
}


< div班= h2_lin>解决方案

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.Path
import java.nio.file.Files

import 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆