2017-12-22 35 views
-4

아래의 방법으로 csv 파일을 읽으려면 SuperCSV 라이브러리를 사용하고 있습니다. 그러나이 메서드는 Collection<Object>을 반환하며 Collection<Double>이 필요합니다. 나는 이미 모든 셀을 Double으로 변환하는 Optional(new ParseDouble()) 프로세서를 사용하고있다.콜렉션 <Object> 콜렉션 <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 라이브러리의 맥락에서이다. 개별 값이 프로세서에서 이미 Doubles로 변환되었으므로 컬렉션을 다시 한 번 변환하지 않고 Collection<Double>을 반환 할 수 있습니다.

+2

질문이 있으십니까? –

+0

@ SkaryWombat 예 어떻게 변환합니까? 나는 그 질문이 분명하다고 확신한다. –

+2

* 질문이 확실한 것으로 확신합니다 * 대답은 –

답변

3

컬렉션 반복 처리 사용 parseDouble :

List<Double> list = new ArrayList<Double>(); 
for(Object obj : rowMap.values()) { 
    list.add(Double.parseDouble(String.valueOf(obj))); 
} 
2

자바 8 솔루션은 java.util.stream 패키지를 사용하는 것 다음 collecton의 스트림을 얻을

내가 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()); 
+2

입니다. OP에서 Java 8 이상을 사용하는 경우주의해야합니다. 모두가 아직 없습니다. – paisanco

+3

@paisanco 모두가 아직 Java 5를 사용하고 있지 않습니다. – shmosel

+3

@paisanco Java 7은 2.5 년 전부터 공개 업데이트가 만료되었습니다. OP가 적어도 Java에서 지원되는 가장 오래된 버전을 사용하기를 원하지 않는다면 질문에 그렇게 대답해야합니다. https://www.java.com/en/download/faq/java_7.xml –