2014-12-31 5 views
5

다음 코드는 개체 목록을 선택적 개체 목록으로 변환합니다. Java 8의 스트림을 사용하여이를 수행하는 우아한 방법이 있습니까?개체 목록을 Java의 선택적 개체 목록으로 변환

List<Object> originalList = Arrays.asList(new Object(), new Object()); 
List<Optional<Object>> convertedList = new ArrayList<>(); 
for (Object object : originalList) { 
    convertedList.add(Optional.of(object)); 
} 

나는 다음 코드를 시도했다.

of(T) in Optional cannot be applied to (java.lang.Object) 

것은 이것은 java.util.Optional 클래스보다는 구아바 하나를 사용한다 :

List<Optional<Object>> convertedList = originalList.stream().map((o) -> Optional.of(o)); 

그러나 이것은 다음과 같은 컴파일 오류가 있습니다.

답변

8

Stream의 요소를 수집하는 것을 잊었습니다. 그것은해야한다 : 당신이 lamdba의 생성을 방지하고 .map(Optional::of)으로이 경우에는 방법 참조를 사용할 수

List<Optional<Object>> convertedList = originalList.stream() 
                .map((o) -> Optional.of(o)) 
                .collect(Collectors.toList()); 
               //or .collect(Collectors.toCollection(LinkedList::new)); if you want a specific List implementation 

참고.

목록에있는 요소가 null이 아닌 것을 미리 아는 경우 ListOptional 인 이유를 알 수 없습니다. 어쩌면 Java 8로 연습하는 것일 수도 있지만 @Eran은 Optional::ofNullable을 대신 사용해야한다고 말했습니다. 당신이 목록에 스트림을 수집하는 것을 잊었다처럼 보이는

+0

응답 해 주셔서 감사합니다. 예제의 목적을 위해 코드를 줄였습니다. 변환 된 List에는이 예제 후에 사용 된 결석 값이 추가되고 originalList에는 null이 포함되지 않습니다. – kentsurrey

+2

람다 형식에 대해 메서드 ref 형식을 사용하는 것이 좋습니다. 메서드 참조 형식을 사용하여 "람다 생성을 피하는"자신을 속일 필요가 없습니다. 메소드 참조는 lambdas와 동일한 기계를 통해 기능 인터페이스로 변환됩니다. 그러나 이러한 결정은 99.999 %의 코드 가독성/유지 보수성을 기준으로 이루어져야하므로보다 읽기 쉬운 것으로 진행해야합니다. 일반적으로이 방법을 참조 할 수 있습니다. –

4

: of가 null 이외의 객체를 요구하기 때문에

List<Optional<Object>> convertedList = 
    originalList.stream() 
       .map((o) -> Optional.ofNullable(o)) 
       .collect(Collectors.toList()); 

당신은 (null 참조를 통과 할 때이 NullPointerException를 던질 것입니다)하지만 ofNullable를 사용해야합니다.

+0

답해 주셔서 감사합니다. 그것은 ofNullable 메서드에 대한 좋은 지적입니다. 그러나이 경우에는 null이 아닌 새로운 목록에 결석 값을 추가 할 코드 조각 이후에만 해당합니다. – kentsurrey

관련 문제