<Object> Java 中的集合到集合<Double>



我正在使用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());

最新更新