2017-04-19 37 views
2

我目前正在使用多層xml數據,並且我想將不同的功能應用於不同層上的不同節點。使用Java 8將不同的函數應用於多層xml數據流

目前我可以保存不同層節點的值:

List<Integer> transactionsGroomIds = 
    transactions.parallelStream() 
       .map(node -> node.children().findChildWithName("GROOM")) 
       .filter(t -> t.getType() == Transaction.GROCERY) 
       .sorted(comparing(Transaction::getValue).reversed()) 
       .map(Transaction::getId) 
       .collect(toList()); 

List<Integer> transactionsCupIds = 
    transactions.parallelStream() 
       .map(node -> node.children().findChildWithName("ACCESS")) 
       .map(node -> node.children().findChildWithName("CUP")) 
       .filter(t -> t.getType() == Transaction.GROCERY) 
       .sorted(comparing(Transaction::getValue).reversed()) 
       .map(Transaction::getId) 
       .collect(toList()); 

正如你所看到的,是去一層深創建的第一個列表中,而由去兩層深創建的第二個列表。

有沒有辦法組合一個清單?例如,如果我創建了一個具有兩個字段(transactionsGroomIds和transactionsCupIds)的Transaction對象,是否有創建一個List<Transaction>的方法可以將transactionGroomIds和transactionsCupIds存儲在一個流中?

進一步澄清:

我想這兩個IDS插入通過構造一個交易對象。有沒有在流中插入代碼的方法:

Transaction newTransaction = new Transaction(transactionsGroomIds, transactionsCupIds) 

謝謝。

+1

目前還不清楚您是否想從這兩個id列表中創建一個Transaction對象,或者您是否想創建一個Transaction對象列表,在這種情況下,根本不清楚哪些id這兩個列表將對應於每個新的'Transaction'對象。也許是你需要一個新郎ID和一個杯子ID來創建一個'Transacion'對象?請澄清。 –

+0

聽起來像你正在尋找番石榴['Streams.zip()'](https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Streams.html #拉鍊java.util.stream.Stream-java.util.stream.Stream-java.util.function.BiFunction-)。 – shmosel

+0

@FedericoPeraltaSchaffner對不起,我錯了,但是我試圖獲得一個新郎ID和一個杯子ID來創建一個事務對象。 – 000000000000000000000

回答

1

Stream.concat將採取兩個流並連接它們。然後,您可以隨意使用組合流。

+0

謝謝。但在我的情況下,我想通過構造函數將兩個id插入到Transaction對象中。有沒有在流中插入代碼的方法:Transaction newTransaction = new Transaction(transactionsGroomIds,transactionsCupIds)? – 000000000000000000000

+1

鑑於這兩件事是流的輸出,我會說不。 –