2017-05-24 11 views
3

메소드 참조를 사용하여 다음 코드를 변환 할 수 있습니까?instanceof 및 클래스 캐스트에 대한 메소드 참조가있는 Java 스트림

List<Text> childrenToRemove = new ArrayList<>(); 

group.getChildren().stream() 
    .filter(c -> c instanceof Text) 
    .forEach(c -> childrenToRemove.add((Text)c)); 

우리가

myList 
    .stream() 
    .filter(s -> s.startsWith("c")) 
    .map(String::toUpperCase) 
    .sorted() 
    .forEach(elem -> System.out.println(elem)); 

이 방법은가 (마지막 줄)이 무엇

myList 
    .stream() 
    .filter(s -> s.startsWith("c")) 
    .map(String::toUpperCase) 
    .sorted() 
    .forEach(System.out::println); 

과 같이 쓸 수있다 참조하여이 가정, 내가 무슨 뜻인지 설명하기 위해 예를 들어 보겠습니다 표현식을 메소드 참조로 변환하는 규칙은 무엇입니까?

답변

9

예,이 방법 참조를 사용할 수 있습니다

.filter(Text.class::isInstance) 
    .map(Text.class::cast) 
    .forEach(childrenToRemove::add); 

대신 각각의 추가 기능에 대한-, 당신은 Collectors.toSet()와 스트림 항목을 수집 할 수 있습니다

:

Set<Text> childrenToRemove = group.getChildren() 
    // ... 
    .collect(Collectors.toSet()); 

사용 toList() 당신은 유지해야하는 경우 아이들의 순서.

이러한 규칙을 적용하여 서명이 일치하는 경우 방법 참조와 람다 표현식을 대체 할 수

ContainingClass::staticMethodName // method reference to a static method 
containingObject::instanceMethodName // method reference to an instance method 
ContainingType::methodName // method reference to an instance method 
ClassName::new // method reference to a constructor 
0

을 내가 그렇게

group.getChildren() 
    .filter(Text.class::isInstance) 
    .map(Text.class::cast) 
    .collect(Collectors.toCollection(() -> childrenToRemove)); 
같은 예는, 가능하다고 생각