Angenommen, ich habe eine Liste von Objekten, die mit Lambda-Ausdrücken (Abschlüssen) definiert wurden. Gibt es eine Möglichkeit, sie zu inspizieren, damit sie verglichen werden können?
Der Code, der mich am meisten interessiert, ist
List<Strategy> strategies = getStrategies();
Strategy a = (Strategy) this::a;
if (strategies.contains(a)) { // ...
Der vollständige Code lautet
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";
}
}
Es scheint, dass die einzige Lösung darin besteht, jedes Lambda als Feld zu definieren und nur diese Felder zu verwenden. Wenn Sie die aufgerufene Methode ausdrucken möchten, sollten Sie sie besser verwenden Method
. Gibt es einen besseren Weg mit Lambda-Ausdrücken?
Ist es auch möglich, ein Lambda zu drucken und etwas menschlich Lesbares zu bekommen? Wenn Sie drucken , this::a
statt
ClosureEqualsMain$$Lambda$1/821270929@3f99bd52
so etwas bekommen
ClosureEqualsMain.a()
oder sogar verwenden this.toString
und die Methode.
my-ClosureEqualsMain.a();