我正在使用SuperCSV库通过以下方法读取csv文件。但是,该方法返回Collection<Object>
,我需要Collection<Double>
。我已经在使用Optional(new ParseDouble())
处理器将每个单元格转换为Double。
问题是你如何转换它/施放它/或者还有其他方法吗?
另外,如果可能的话,我需要避免任何昂贵的操作,因为这种方法经常被调用。
private static Collection<Object> partialReadWithCsvMapReader(int row, String[] header, CellProcessor[] processors) throws Exception {
ICsvMapReader mapReader = null;
Map<String, Object> rowMap = null;
try {
mapReader = new CsvMapReader(new FileReader(CSV_FILENAME), CsvPreference.STANDARD_PREFERENCE);
mapReader.getHeader(true);
while( (rowMap = mapReader.read(header, processors)) != null ) {
if(mapReader.getLineNumber() == row){
break;
}
}
}
finally {
if( mapReader != null ) {
mapReader.close();
}
}
return rowMap.values();
}
问题出在SuperCSV库的上下文中。由于各个值已由处理器转换为双打 - 是否可以返回
Collection<Double>
而不必再次转换集合。
答案 0 :(得分:3)
迭代收集并使用parseDouble
:
List<Double> list = new ArrayList<Double>();
for(Object obj : rowMap.values()) {
list.add(Double.parseDouble(String.valueOf(obj)));
}
答案 1 :(得分:2)
Java 8 解决方案涉及使用java.util.stream
包:
我会使用Collection#stream
来获取收集器的流,
然后使用Stream#mapToDouble
将其转换为一行语句:
return rowMap.values().stream().mapToDouble(obj -> {
if (obj instanceof String)
return Double.parseDouble(String.valueOf(obj));
else if (obj instanceof Double)
return (double) obj;
return 0;
}).boxed().collect(Collectors.toList());