2017-03-18 1 views
0

우리에게 PredicateFunction - 인터페이스를 말할 수 기능 인터페이스를 구현 a boolean 그리고 우리의 경우 매개 변수는 문자열입니다. 그런데 왜 다음과 같은 방법 참조는 잘 될 것 같다 :자바 8 :</p> <pre><code>Function<String, String> function = null; Predicate<String> predicate = null; </code></pre> <p>이 지금은 반환 유형이 곳 <code>Predicate</code> - 인터페이스 방법 참조를주고 싶다 : 방법을 이해하지 않습니다 자바는

Predicate<String> predicate = String::isEmpty; 

isEmpty -method에는 문자열 매개 변수가없는의 Predicate - 인터페이스는 문자열 매개 변수를 필요로하지만. 왜 아직도 옳은가? 내가 놓친 게 있니?

다른 예제 : 함수 인터페이스는 우리의 경우 String을 반환하고 매개 변수로 String을 사용합니다. 그러나 다음 메서드 참조가 잘못된 것으로 보입니다.

Function<String, String> function = String::concat; //wrong 

Concat-Method는 String을 매개 변수로 사용하고 String을 반환합니다. 왜 그렇게 잘못 됐어?

누군가가 나에게 설명하기를 바랍니다.

+0

질문은 실제로 기능 인터페이스가 아닌 메소드 참조에 관한 것입니다. https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html을 통해 읽어 볼 것을 권장합니다. 4 가지 유형의 메소드 참조와 약식 인 람다 식을 설명합니다. – sprinter

답변

3

인스턴스 메소드에서 메소드 참조를 사용하면 메소드 수신자가 첫 번째 인수가됩니다. 그래서

String::isEmpty 

(String str) -> str.isEmpty() 

String::concat 

에 해당하는 Function의 유형과 일치하지 않습니다

(String a, String b) -> a.concat(b) 

...에 해당합니다. Function.apply(T t)는 하나 개의 인자 (t)를 취하면서 (루이 서면으로)

Function<String, String> function = (String a, String b) -> a.concat(b); 

에 해당하기 때문에

+1

완벽을 기하기 위해 특정 개체의 인스턴스 메서드에 대한 참조의 예제를 추가하는 것이 좋습니다. 예를 들어'myString :: concat'는'(String a) -> myString.concat (a)'와 같습니다. – sprinter

0

Function<String, String> function = String::concat; 

컴파일되지 않는 이유는 당신은 함수를 전달하는 두 개의 인수 (ab)가 필요합니다.

0

String::isEmpty은 두 가지 중 하나를 의미 할 수 있습니다.

  1. String 클래스의 정적 방법 :

    s -> String.isEmpty(s) 
    
  2. String 클래스의 인스턴스 방법 :

    (String s) -> s.isEmpty() 
    

귀하의 경우 2 #에 빠진다.

마찬가지로, String::concat 두가지 중 하나를 의미 할 수있다.

(s1, s2) -> String.concat(s1, s2) 

또는

(String s1, String s2) -> s1.concat(s2) // Your case 

(가 정확하게 하나 개의 인수를 고려하지 않습니다 그러나이하는 Function<String, String> 아니다 그것은이다, 그러나 BinaryOperator<String>입니다.)