将Java标记器转换为流对象以利用过滤

将Java标记器转换为流对象以利用过滤,java,file-io,java-8,Java,File Io,Java 8,我正在编写一些基本的文件I/o代码,并认为我可能会利用Java8流;尤其是过滤。最终目标是读入文件并仅标记适用的行。以下是我当前的代码: public void readInFile(String csvFile){ BufferedReader br = null; String line = ""; final String csvSplitBy = ","; try { br = new BufferedReader(new File

我正在编写一些基本的文件I/o代码,并认为我可能会利用Java8流;尤其是过滤。最终目标是读入文件并仅标记适用的行。以下是我当前的代码:

 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);
}
非常好的锅炉板。下面是使用流的代码:

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();
    }
}
public void解析文件(字符串文件名){
try(Stream=Files.line(path.get(fileName))){
流动
.filter(w->w.startsWith(“付款”))
//创建对象
}捕获(IOE异常){
e、 printStackTrace();
}
}

有没有一种方法可以在foreach中放置一个标记器,或者输出一个字符串对象,我可以将其输入到另一个方法中?

您拥有的两段代码没有做相同的事情,但是您的问题听起来好像您不知道该方法。此方法允许将每个流元素转换(即映射)为另一个元素。在本例中,我们要映射两件事:

  • 将每一行拆分为一个事务,该事务是由分隔符拆分的行
  • 将每个事务字符串转换为真实的事务对象
因此,我们可以有两个
map
操作:

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);
列表事务=null;
try(Stream=Files.line(path.get(fileName))){
交易=
stream.filter(w->w.startsWith(“付款”))
.map(左->左拆分(csvSplitBy))
.map(t->新QB交易(新交易详情(
t[交易日期],
t[交易数量],
t[交易名称],
Double.parseDouble(t[交易金额])
)))
.collect(Collectors.toList());
}
transactionServiceImpl.addAll(事务);

代码的其余部分将其收集到一个列表中,并最终通过将该列表作为参数来调用您的服务。

是的,map类正是我所缺少的,谢谢。