2016-02-11 45 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