我正在使用SuperCSV库来读取以下方法的CSV文件。但是,该方法返回Collection<Object>
,我需要Collection<Double>
。我已经在使用Optional(new ParseDouble())
处理器,该处理器将每个单元转换为双重。
问题是如何将其转换/施放/或其他方法?
另外,如果可能的话,我需要避免任何昂贵的操作,因为此方法经常被调用。
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>
,而不必再次转换集合。
在集合上迭代并使用 parseDouble
:
List<Double> list = new ArrayList<Double>();
for(Object obj : rowMap.values()) {
list.add(Double.parseDouble(String.valueOf(obj)));
}
a Java 8 解决方案涉及使用java.util.stream
软件包:
我会使用 Collection#stream
获取collecton的流 然后使用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());