2017-09-19 21 views
6

Java에서 람다를 사용하려고하지만 전혀 작동하지 않습니다. Java의 FunctionalInterfaces에있는 Lambdas

@FunctionalInterface 
public interface MyFunctionalInterface { 
    String getString(String s); 
} 

지금 내 코드에서 내가 아니라 여기 lambda를 사용 :이 같은 @FunctionalInterface을 만들어

MyFunctionalInterface function = (f) -> { 
    Date d = new Date(); 
    return d.toString() + " " + person.name + " used fnc str"; 
}; 

다음, 내 function의 사용은 다른 클래스의 생성자로 전달 만들고 싶어하고 다음과 같이 사용하십시오 :

public SampleClass(MyFunctionalInterface function) { 
    String tmp = "The person info: %s"; 
    this.result = String.format(tmp, function.getString(String.valueOf(function))); 
} 

왜 여기에 valueOf()을 사용해야합니까? 이 덕분에 그냥 function.getString()을 사용할 수 있다고 생각 했나요?

출력 : 어떤 인수없이 호출 할 수 있도록Tue Sep 19 11:04:48 CEST 2017 John used fnc str

+0

당신의 함수는 같은'String'를 취합니다

@FunctionalInterface public interface MyFunctionalInterface { String getString(Person p); } MyFunctionalInterface function = p -> { Date d = new Date(); return d.toString() + " " + p.name + " used fnc str"; }; public SampleClass(MyFunctionalInterface function, Person person) { String tmp = "The person info: %s"; this.result = String.format(tmp, function.getString(person)); } 

또는, 당신은 당신의 기능 인터페이스의 방법에서 인수를 제거 할 수 있습니다 매개 변수. 문자열 형식을 읽으면 그 사람 정보를'String'으로 전달해야합니다. 지금 당장은 함수 자체의 문자열 표현을 함수에 전달하고 있습니다. – marstran

+0

당신이 달성하고자하는 것은 분명하지 않습니다. 나는 당신이 함수를 사용하는 곳에서 람다 정의를 기대했을 것이다. 또는 메서드 참조를 사용합니다. 지금 당장 가지고있는 코드는 함수가 그 자체의 문자열 표현을 표현하고 생성 한 다음 함수 자체에 입력으로 전달되는 OBJECT를 돌려 줄 것이라고 생각합니다. 단순히 의미가 없습니다. – GhostCat

+0

이 코드의 출력은 무엇입니까? – jrook

답변

5

귀하의 getString 방법은하는 String 인수가 필요합니다.

람다 식에서는 String 인수를 무시하고 대신 person 변수 (사용자가 선언 한 위치를 표시하지 않은 변수)의 데이터를 사용합니다.

아마도 당신의 기능 인터페이스 대신 Person 인수를해야합니다

@FunctionalInterface 
public interface MyFunctionalInterface { 
    String getString(); 
} 

MyFunctionalInterface function =() -> { 
    Date d = new Date(); 
    return d.toString() + " " + person.name + " used fnc str"; 
}; 

public SampleClass(MyFunctionalInterface function) { 
    String tmp = "The person info: %s"; 
    this.result = String.format(tmp, function.getString()); 
} 
+0

흠, 특정 객체를 전달할 수 없습니다. 왜냐하면'person '(예 :'car','animal' 등)이 아닌'Inerface'를 사용하여 많은 객체를 형식화하고 싶습니다. – soommy12

+0

@ soommy12이 경우 아마도 기능 인터페이스를 generic으로 만들 수 있습니다. - interface MyFunctionalInterface '. 물론 p.name과 같은 특정 속성을 사용하려는 경우 T에 바인딩 된 일부 유형을 배치해야합니다 ('','SomeType'은'name' 속성이있는 클래스입니다). 그렇지 않으면,'getString()'메쏘드 (그리고 람다 표현식)에서 인자를 제거하고 그 밖의 모든 것을 그대로 유지할 수있다. – Eran

+0

좋아,하지만 또 다른 질문은 내가 아무것도 걸리지 않고'String'을 반환하도록 인터페이스를 만들 수 있습니까? 내 말은, 나는 여기에 어떤 종류의 "추상적 인 방법"을 만들고 싶다. 나는'String'으로 일을하고 그것을 돌려주고 싶다. 나는 lamdas에 의해 이것을 달성 할 수 있습니까? – soommy12