java - Java Stream 映射或创建 FileStream 的新对象
问题描述
如果我有一个制表符分隔的文件,当我使用该BufferedReader
对象时,我可以使用 Stream Api,如过滤器、映射、减少等方法,所以如果 Stream
//first Line is Header Identified by #
# SUBSTANCE 2,60 25.04.2012 00:02:48 01.01.2000 24.04.2012
//this is my R Object which has attached two RN Objects
R 10 - 016-053-00-8 402-460-1 0 0 0 0 0 0
RN 10 0 DE (C16oderC18-n-Alkyl)(C16oderC18-n-alkyl)ammonium-2-((C16oderC18-n-alkyl)(C16oderC18-n-alkyl)carbamoyl)benzolsulfonat
RN 10 0 EN (C16orC18-n-alkyl)(C16orC18-n-alkyl)ammonium 2-((C16orC18-n-alkyl)(C16orC18-n-alkyl)carbamoyl)benzenesulfonate
我需要像嵌套数组一样创建对象或 MAP (Header, rObject (rnObject,rnObject)),那么我可以使用 Stream API 来执行此操作吗?
我已经试过了
BufferedReader in = new BufferedReader(new FileReader(absoluteFilePath));
List test = in.lines().limit(4).filter(identifier -> identifier.startsWith("RN")).map(line -> line.split("\\t")).collect(Collectors.toList());
所以很明显它不起作用,因为我得到了输出
test.forEach(it -> System.out.println(it));
[Ljava.lang.String;@326de728
[Ljava.lang.String;@25618e91
所以我想我可以用 Stream Api 创建一个 Map 所以我认为我想要的方式是不可能的,所以我可以创建一个 while lop 并创建你认为的对象?
解决方案
最好的办法是将列表正确识别为字符串列表,并且不要使用原始列表。
由于拆分的结果是一个字符串数组,因此您必须将其包装为一个列表。
然后您将拥有一个列表列表,为此使用 flatMap 将所有列表合并为一个唯一的列表,然后您将能够使用收集器并将其存储在一个列表中。
List<String> test = in.lines().limit(4).filter(identifier -> identifier.startsWith("RN")).map(line -> Arrays.asList(line.split("\\t"))).flatMap(List::stream).collect(Collectors.toList());
您的示例的主要问题是您正在存储数组对象的原始列表。因此,当您将 toString() 调用到数组中时,您会得到以方括号开头的 hashReference。
希望这对你有帮助!
推荐阅读
- javascript - 关于调整/延迟函数计时的 JavaScript 帮助
- java - 添加到 Array-List 在 For-Loop 中不起作用
- git - 了解如何压缩提交
- java - 向 JSP 公开 Spring 组件
- intellij-idea - SBT 无法读取 IntelliJ 中的环境变量
- vue.js - 如何让 v-data-table 在 vuetify 中为 - 和 + 呈现图标?
- java - 找不到 activemq.xml 的 Spring NamespaceHandler
- c# - 当不断有多个呼叫者等待进入时,SemaphoreSlim 是否保证进入
- python - Python 请求登录后失败,页面已过期
- excel - VSTO ListObject 重命名事件