람다 식 (클로저)을 사용하여 정의 된 객체 목록이 있다고 가정 해 보겠습니다. 비교할 수 있도록 검사하는 방법이 있습니까?
내가 가장 관심있는 코드는
List<Strategy> strategies = getStrategies();
Strategy a = (Strategy) this::a;
if (strategies.contains(a)) { // ...
전체 코드는
import java.util.Arrays;
import java.util.List;
public class ClosureEqualsMain {
interface Strategy {
void invoke(/*args*/);
default boolean equals(Object o) { // doesn't compile
return Closures.equals(this, o);
}
}
public void a() { }
public void b() { }
public void c() { }
public List<Strategy> getStrategies() {
return Arrays.asList(this::a, this::b, this::c);
}
private void testStrategies() {
List<Strategy> strategies = getStrategies();
System.out.println(strategies);
Strategy a = (Strategy) this::a;
// prints false
System.out.println("strategies.contains(this::a) is " + strategies.contains(a));
}
public static void main(String... ignored) {
new ClosureEqualsMain().testStrategies();
}
enum Closures {;
public static <Closure> boolean equals(Closure c1, Closure c2) {
// This doesn't compare the contents
// like others immutables e.g. String
return c1.equals(c2);
}
public static <Closure> int hashCode(Closure c) {
return // a hashCode which can detect duplicates for a Set<Strategy>
}
public static <Closure> String asString(Closure c) {
return // something better than Object.toString();
}
}
public String toString() {
return "my-ClosureEqualsMain";
}
}
유일한 해결책은 각 람다를 필드로 정의하고 해당 필드 만 사용하는 것입니다. 호출 된 메서드를 인쇄하려면을 사용하는 것이 좋습니다 Method
. 람다 식을 사용하는 더 좋은 방법이 있습니까?
또한 람다를 인쇄하여 사람이 읽을 수있는 것을 얻을 수 있습니까? this::a
대신 인쇄 하는 경우
ClosureEqualsMain$$Lambda$1/821270929@3f99bd52
뭔가 얻을
ClosureEqualsMain.a()
또는 사용 this.toString
및 방법.
my-ClosureEqualsMain.a();