在Java中将<object>集合到Collection <double>

时间:2017-12-22 02:19:36

标签: java collections supercsv

我正在使用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>而不必再次转换集合。

2 个答案:

答案 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());