我一直在玩动态LINQ,我想知道Java是否有可能做类似的事情。例如,如果我使用这个工作代码:
Stream<PoliceShooting> averageAge = peopleShot.stream().filter(t->t.getAge() != null);
有没有一种方法可以让它像使用动态LINQ一样动态
String dynamicGetter = "t.getAge() != null"
Stream<PoliceShooting> averageAge = peopleShot.stream().filter(t->dynamicGetter);
依靠 Nashorn,如如何将字符串转换为 lambda 表达式?中所建议的那样,您可以定义一个从 JavaScript 代码构建谓词
的方法:
public Predicate<Object> convertJSToPredicate(String js) throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
return (Predicate<Object>) engine.eval("new java.util.function.Predicate(function(t) " + js + ")");
}
然后将其用作:
String dynamicGetter = "t.getAge() != null";
Stream<PoliceShooting> averageAge = peopleShot.stream()
.filter(convertJSToPredicate(dynamicGetter));
当然,动态盖特
必须是 JavaScript 而不是 Java 代码,并且可以通过变量 t
访问传入的对象。
请注意,Nashorn在Java11中被弃用。我假设会出现替代实现。
问题内容: 我目前正在为我的一个类进行分配,在其中,我必须使用Java语法给出 静态 和 动态绑定的 示例。 我了解基本概念,即静态绑定在编译时发生,而动态绑定在运行时发生,但是我无法弄清楚它们实际上是如何工作的。 我找到了一个在线静态绑定的示例,给出了以下示例: 并且这将显示“ animal is eating”,因为 对的调用使用了静态绑定,但是我不确定 为什么 将其视为静态绑定。 到目前为止
请有人给我解释一下输出的最后6行是如何打印出来的。我知道,由于静态绑定,前三行打印适当。 我不知道为什么第5行给出了输出,因为它是Ipod类型的,它没有任何歌曲方法,但它仍然打印输出。代码如下: 输出如下所示:
起初我是一个初学者 我看过很多教程,读过很多例子,甚至试图从JLS来理解这个主题,但我仍然有一些困惑或误解。 让我给你看我看不懂的问题。
问题内容: 在上面的程序中,我尝试调用 aObj.b时 遇到错误。 1.为什么我无法通过aObj访问该变量,尽管它引用的是B类? 2.为什么我可以使用show()方法? 问题答案: 你有区分 静态类型 的和 运行时类型 的。 代码如 产生具有静态类型和运行时类型的变量。 在决定允许或不允许的内容时,编译器也只会考虑 静态类型 。 对您的问题: 1.为什么我无法通过aObj访问该变量,尽管它引用的是
本文向大家介绍java中动态代理的实现,包括了java中动态代理的实现的使用技巧和注意事项,需要的朋友参考一下 动态代理的实现 使用的模式:代理模式。 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。类似租房的中介。 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制来实现的,目标类基于统一的接口(InvocationHandler) (2)cglib动