将Java标记器转换为流对象以利用过滤
我正在编写一些基本的文件I/o代码,并认为我可能会利用Java8流;尤其是过滤。最终目标是读入文件并仅标记适用的行。以下是我当前的代码:将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
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类正是我所缺少的,谢谢。