如何正确确定一个对象是一个lambda?

Art*_*lan 44 java lambda java-8

我看到lambda的类是isSynthetic() && !isLocalOrAnonymousClass(),但我认为代理类可能也是如此.

当然,我可以检查getDeclaredMethods().length == 1并申请regexp课程名称.

但是我想知道是否有一个更优雅和更健壮的选项来查明给定对象是否是lambda.

Bri*_*etz 56

按设计,没有正式的方法可以做到这一点.Lambdas是语言的一部分; 并通过功能接口集成到类型系统中.应该没有必要将Runnable开始生活区分为lambda,命名类或内部类 - 它们都是Runnables.如果你认为你必须通过拆分类文件来"处理lambda",你几乎肯定会做错事!

  • 这些问题表明,你没有完全了解*擦除*如何在实现Java泛型中起作用.这与lambda无关; 相同的问题出现在命名类中. (8认同)
  • @Holger:这种技术非常危险.与非可序列化的lambda相比,序列化lambda具有明显更高的性能成本,并且安全性较低(序列化本质上是行为和/或捕获数据的公共隐藏构造函数,程序员可能打算保密.)这不是免费的午餐. (7认同)
  • 对你的"我不确定我同意你"的回答:这是纯粹的一厢情愿.是的,有一些极端情况你可以通过反思来咳出一些编译时类型决策(特别是匿名类),但这些都是例外,而不是相反.仿制药被删除; 反思是为了反映CLASSES,而不是INSTANCES.当然,我可以想象你希望它以不同的方式工作,但你正在寻找"我如何"的答案,而它们并不存在. (6认同)
  • @damluar太多理由适合600个字符!这是其中一个显而易见的想法的典型例子,但事后证明这是错误的做法.有以下原因,请参阅https://www.youtube.com/watch?v=MLksirK9nnE. (5认同)
  • @Artem Bilan:见[这个答案](http://stackoverflow.com/a/22333357/2711488) (2认同)