为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法比较lambdas?

有没有办法比较lambdas?

饮歌长啸 2019-08-13 14:19:29
有没有办法比较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();
查看完整描述

3 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

为了比较labmdas,我通常让接口扩展Serializable,然后比较序列化的字节。不是很好,但适用于大多数情况。


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 397 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号