ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

将Java Tokenizer转换为Stream对象以利用过滤的优势

2019-11-19 04:03:37  阅读:153  来源: 互联网

标签:java-8 file-io java


我正在编写一些基本的文件I / O代码,并认为我可能会利用Java 8 Streams.特别是过滤.最终目标是读取文件并仅标记适用的行.以下是我当前的代码:

 public void readInFile(String csvFile){

    BufferedReader br = null;
    String line = "";
    final String csvSplitBy = ",";

    try {

        br = new BufferedReader(new FileReader(csvFile));
        while ((line = br.readLine()) != null) {
            String[] transaction = line.split(csvSplitBy);
            transactions.add(new QBTransaction(
                    new TransactionDetails(transaction[TRANSACTION_DATE],
                            transaction[TRANSACTION_NUM],
                            transaction[TRANSACTION_NAME],
                            Double.parseDouble(transaction[TRANSACTION_AMOUNT]))));
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    transactionServiceImpl.addAll(transactions);
}

非常锅炉板.这是使用Stream的代码:

public void parseFile(String fileName) {

    try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
        stream
                .filter(w -> w.startsWith("Payment"))
                //create object
    } catch (IOException e) {
        e.printStackTrace();
    }
}

有没有一种方法可以将标记器放在foreach中,或者输出我可以提供给另一个方法的String对象?

解决方法:

您拥有的两个代码段没有做相同的事情,但是您的问题听起来好像您不了解map(mapper)方法.该方法允许将每个Stream元素转换(即映射)为另一个元素.在这种情况下,我们要映射两件事:

>每行都进入一个事务,这是由分隔符分割的行
>每个交易字符串都变成一个真实的交易对象

因此,我们可以为此执行两个地图操作:

List<QBTransaction> transactions = null;
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
    transactions =
        stream.filter(w -> w.startsWith("Payment"))
              .map(l -> l.split(csvSplitBy))
              .map(t -> new QBTransaction(new TransactionDetails(
                 t[TRANSACTION_DATE],
                 t[TRANSACTION_NUM],
                 t[TRANSACTION_NAME],
                 Double.parseDouble(t[TRANSACTION_AMOUNT])
              )))
              .collect(Collectors.toList());
}
transactionServiceImpl.addAll(transactions);

其余代码将其收集到列表中,最后通过将该列表作为参数来调用您的服务.

标签:java-8,file-io,java
来源: https://codeday.me/bug/20191119/2033105.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有