有没有办法比较lambdas?

有没有办法比较lambdas?

假设我有一个使用lambda表达式(闭包)定义的对象列表。有没有办法检查它们,以便可以进行比较?

我最感兴趣的代码是

    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";
    }}

看起来唯一的解决方案是将每个lambda定义为一个字段并仅使用这些字段。如果要打印出所调用的方法,最好使用Method。lambda表达式有更好的方法吗?

此外,是否可以打印lambda并获得人类可读的东西?如果你打印this::a而不是

ClosureEqualsMain$$Lambda$1/821270929@3f99bd52

得到类似的东西

ClosureEqualsMain.a()

甚至使用this.toString和方法。

my-ClosureEqualsMain.a();


饮歌长啸
浏览 357回答 3
3回答

守着星空守着你

为了比较labmdas,我通常让接口扩展Serializable,然后比较序列化的字节。不是很好,但适用于大多数情况。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java