2016-02-11 63 views
3

我正在编写一些基本的文件I/O代码,并认为我可能会利用Java 8 Streams;特别是过滤。最终目标是读入文件并仅标记适用的行。以下是我当前的代码:将Java Tokenizer转换为Stream对象以便利用过滤

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(); 
    } 
} 

有没有把一个标记在foreach,或许输出一个String对象,我可以养活到另一个方法的方法吗?

回答

3

你有两个代码片段不会做同样的事情,但你的问题听起来像你不知道map(mapper)方法。该方法允许将每个流元素转换(即映射)为另一元素。在这种情况下,我们希望两件事地图:

  • 每一行成交易,这是由分离器
  • 每个事务串线分割成一个真正的交易对象

因此,我们可以有两个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); 

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

+0

是的,该地图类正是我想念,谢谢。 – StillLearningToCode