首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java输入/输出流的函数式编程方法

Java输入/输出流的函数式编程方法
EN

Stack Overflow用户
提问于 2010-06-01 15:34:34
回答 3查看 1.6K关注 0票数 5

我正在使用Java的DataInputStream和scala来解析一些简单的二进制文件(这是非常糟糕的经验,因为缺少无符号类型,即使在scala中也是如此,但那是另一回事)。

然而,我发现自己不得不使用可变数据结构,因为Java的流本质上是保持状态的实体。

用好的函数式数据结构包装Java流的好设计是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-01 16:39:04

目前有一个项目正在进行中,该项目旨在为Scala创建一个IO:scala IO,它的灵感来自于Java7NIOAPI。它仍然是一个WIP,但您可能从中得到一些有趣的想法。还有一些关于如何使用它的示例,可以在here中找到

票数 5
EN

Stack Overflow用户

发布于 2010-06-01 22:42:09

读取文件的全部意义在于获得以前没有的状态。因此,我不太明白你到底想要什么。

人们可以假装拥有整个宇宙作为输入(和输出)参数,并创建一个“功能”模拟,但我从来没有看到过明确的演示,表明这具有任何优越的特征。

大多数函数式数据结构允许您对副本数量进行抽象。例如,列表允许您以方便的方式(map、reduce等)将对单个元素的操作扩展到所有元素。但是当您想要读取一个文件时,您需要对数据类型进行抽象,而且您实际上并不希望它完全抽象--您希望匹配您期望的某种类型的模板。我怀疑,如何指定这个模板--以及如何处理错误条件--是读取二进制文件挑战的核心。

(还要注意,除非您运行在高度多核的Sun机器(例如T2000)上,否则出于安全考虑,您不需要不变性,因为一个线程足以处理所有低级输入处理。)

一种可能性是将二进制文件读取视为解析问题。Scala目前还没有一个健壮的库,但在this thread上可以找到Paul Phillips写的一些很好的代码,这些代码在这方面很有帮助。

另一种可能是自己创建某种模板,例如

代码语言:javascript
复制
List(classOf[Float],classOf[Int],classOf[String])

然后编写一些内容,用match语句按顺序解析该流:

代码语言:javascript
复制
val FloatClass = classOf[Float]
listEntry match {
  case FloatClass => // Read float
  ...
 }

这些事情使得读取二进制文件的工作变得容易得多,而且至少在某种程度上是实用的,因为您可以将输入字节流映射到List[Any],然后使用模式匹配来获取所需的数据。

票数 2
EN

Stack Overflow用户

发布于 2010-06-01 16:13:38

看一下来自Haskell的纯函数式方法的IO Monad

一个实用的Scala实现将基于流实现Iterator/Iterable。例如,scala.io.Source supports this。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2947967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档