栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将字符串转换为lambda表达式?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将字符串转换为lambda表达式?

马可对这个问题的评论是正确的。您无法从文件中读取裸Java lambda表达式,因为没有上下文提供的目标类型就无法定义这样的表达式。例如,考虑以下方法声明:

void method1(BiFunction<String,String,String> f) { ... }void method2(BiFunction<Integer,Integer,Integer> f) { ... }

然后在以下代码中,

method1((x, y) -> x + y);method2((x, y) -> x + y);

这两个lambda表达式的

(x, y) -> x + y
含义 完全不同
。对于method1,
+
运算符为字符串连接,但对于method2,则表示整数加法。

这有点偏离您的问题,但是您可以使用动态语言阅读和评估lambda或函数表达式。在Java 8中,有Nashorn
Javascript引擎。因此,您可以尝试使用Nashorn(从Java调用)来读取和评估 Javascript 函数,而不必尝试读取评估Java
lambda表达式的方法。

以下代码在arg [0]中接受一个函数,并将其应用于每个后续函数,并打印结果:

import java.util.function.Function;import javax.script.*;public class scriptFunction {    public static void main(String[] args) throws Exception {        scriptEngine engine = new scriptEngineManager().getEngineByName("nashorn");        @SuppressWarnings("unchecked")        Function<Object,Object> f = (Function<Object,Object>)engine.eval( String.format("new java.util.function.Function(%s)", args[0]));        for (int i = 1; i < args.length; i++) { System.out.println(f.apply(args[i]));        }    }}

例如,运行命令

java scriptFunction 'function(x) 3 * x + 1' 17 23 47

给出结果

52.070.0142.0

newjava.util.function.Function
为了在Nashorn的Javascript函数概念和Java的Function接口之间创建一个适配器,必须在函数字符串内部进行包装。(也许有更好的方法,但我不知道。)将返回值强制转换为
eval
to会
Function<Object,Object>
导致未经检查的强制转换警告,我认为这是不可避免的,因为这是Javascript(动态)类型语言和Java(静态类型)。最后,不执行任何错误检查。我敢肯定,如果违反某些假设(例如第一个参数实际上并不代表Javascript函数),那么它将以各种讨厌的方式爆炸。

但是,如果需要评估从文件读取的表达式或函数,则可能会发现此技术很有用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453194.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号