2016-10-12 4 views
5

누군가 메소드 참조를 사용하도록 다음 코드를 변환 할 수 있습니까? 나는이 새로운 구문 주위에 내 머리를 정리하기 위해 노력하고있어하지만 하나의 변수가 하나의 메소드 호출에 대응하기보다 더 복잡 얻을 때 나는 빨리 분실 :lambdas를 메소드 참조로 변환하십시오.

getWorkspaces().stream().forEach((ws) -> { 
      DataStoreInfo defaultDataStore = getDefaultDataStore(ws); 
      if (defaultDataStore != null) { 
       other.setDefaultDataStore(ws, defaultDataStore); 
      } 
     }); 

내가이 시작하지만, '아무튼 t 작업 :

getWorkspaces().stream() 
       .map(this::getDefaultDataStore) 
       .filter(Objects::nonNull) 
       .map(other::setDefaultDataStore); 

편집 : "그것은 작동하지 않습니다", 나는이 IDE는이 방법을 해결할 수없는 "setDefaultDataStore"의 마지막 줄에 불만을 의미한다. 나는 일하는 것으로 시작할 수 있었으면 좋겠지 만, 나는 거기에 도착하는 방법을 모른다. 메소드 참조를 사용하여 2 개의 매개 변수를 취하는 메소드를 호출하는 방법과 그 메소드를 매핑하는 방법에 대해서는 매우 혼란 스럽습니다. 이에

getMaps().stream().forEach((m) -> { 
      other.add(m); 
     }); 

: I는 다음과 같습니다 몇 가지 코드를 변환 한

getMaps().forEach(other::add); 

하지만 더 복잡한 얻을 때 나는 손실됩니다. 메서드 참조가있는 동일한 코드를 작성하는 방법에 대한 확실한 해결책이 있었으면합니다.

+3

"작동하지 않음"이란 무엇을 의미합니까? 보다 구체적으로, 이상적으로 [mcve]를 제공하십시오. –

+2

@GhostCat : 나는하지 못했다. 그러나 더 이상 세부 사항없이 "작동하지 않는다"는 것은 이상적인 질문에서 멀리 떨어져있다. –

+2

"메소드 참조 사용"을 시도하기 전에이 메소드없이 작동하는 것을 작성해야합니다.두 번째 스 니펫은 람다 식에서도 작동하지 않으며 메서드 참조를 사용하는 것과 관련이 없습니다. 우선,'setDefaultDataStore'에 두 개의 매개 변수가 필요합니다. 그래서 그들을 저장해야합니다. – Tunaki

답변

1

코드를 이처럼 람다 버전으로 변환 할 수 있지만 예상대로 깨끗하지는 않습니다.

words.stream().map(ws -> new SimpleImmutableEntry<>(ws, getDefaultDataStore(ws))) 
       .filter(e -> e.getValue() != null) 
       .forEach(e -> setDefaultDataStore(e.getKey(), e.getValue())); 

주 : e는 입력 약어입니다. 방법은 https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

를 참조에 대한

1

당신은 호출 방법을 존재하지만 람다는 아무것도하지 않는 경우, 당신은 방법을 참조로 교체 할 수 있습니다 여기에 많은 유용한 정보를 읽을 수 있습니다. 따라서 람다에 익숙하다면 메서드 참조를 쉽게 처리 할 수 ​​있습니다. 에 containingObject :: instanceMethodName

  • 참조 - ContainingClass :: staticMethodName
  • 특정 객체의 인스턴스 메소드에
  • 참조 -

    은 그 4 가지 정적 메서드에

    1. 참조있다 예 특정 임의의 개체에 대한 메서드 형식 - 포함 형식 :: 메서드 이름
    2. construc 토르 - ClassName :: new

    질문으로 돌아 가기 : .map (other :: setDefaultDataStore);

    스트림 멤버를 통해 일부 측면 연산을 수행하는 데 map 함수를 사용하면 안됩니다.이 함수는 스트림을 다른 스트림으로 변환하는 데 사용됩니다. 대신 foreach 사용자

    getWorkspaces().stream() 
           .map(this::getDefaultDataStore) 
           .filter(Objects::nonNull) 
           .foreach(other::setDefaultDataStore);