在javax.scripting javascript环境中导入地图
发布时间:2020-12-14 05:37:31 所属栏目:Java 来源:网络整理
导读:我在 javax.scripting地图实现中看到一些奇怪的行为. 在线示例显示了在js环境中添加列表的example: ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine jsEngine = mgr.getEngineByName("JavaScript"); ListString namesList = new ArrayL
我在
javax.scripting地图实现中看到一些奇怪的行为.
在线示例显示了在js环境中添加列表的example: ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine jsEngine = mgr.getEngineByName("JavaScript"); List<String> namesList = new ArrayList<String>(); namesList.add("Jill"); namesList.add("Bob"); namesList.add("Laureen"); namesList.add("Ed"); jsEngine.put("namesListKey",namesList); System.out.println("Executing in script environment..."); try { jsEngine.eval("var names = namesListKey.toArray();" + "for(x in names) {" + " println(names[x]);" + "}" + "namesListKey.add("Dana");"); } catch (ScriptException ex) { ex.printStackTrace(); } System.out.println(namesList); 但是,如果您尝试使用与地图类似的操作,则会看到奇怪的行为.一方面,如果您尝试迭代地图键,例如 HashMap<String,Object> m = new HashMap<String,Object>(); jsEngine.put("map",m); 没有办法获取地图键 – 如果您尝试遍历键,您将获得方法名称 – jsEngine.eval(" for (var k in m.keySet()){ println(k)};"); 结果是 : notifyAll removeAll containsAll contains empty equals ... 在js上下文中,您可以使用m.get(key)来映射地图中的值,但不能使用m [key]来处理值,如果该键不存在,则会引发错误.有人可以对这个行为有所了解,还是只是打破了?谢谢. 解决方法
for..in在JavaScript中与Java中的每个都不一样,即使它们看起来相似. for JavaScript在JavaScript中迭代对象中的属性名称.方法名称暴露给Rhino作为本机Java HashMap对象的属性,就像您有以下JavaScript对象一样:
{ notifyAll:function(){},removeAll:function(){},containsAll:function(){},contains:function(){},empty:function(){},equals:function(){} } 我的建议是使用Set.toArray方法将HashMap keyset转换为数组,或者使用Set.iterator()获取迭代器.这是一个简短的Rhino脚本,显示了如何使用toArray方法完成此操作: x=new java.util.HashMap(); x.put("foo","bar"); x.put("bat","bif"); x.put("barf","boo"); var keyArray = x.keySet().toArray(); for(var i=0,l = keyArray.length; i < l; i++){ var key = keyArray[i]; var value = x.get(key); print(value); } 哪些输出: bif bar boo 以下是使用Set.iterator做同样的事情: x=new java.util.HashMap(); x.put("foo","boo"); var keyIter = x.keySet().iterator(); while(keyIter.hasNext()){ var key = keyIter.next() var value = x.get(key); print(value); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – 为什么onNewIntent(Intent intent)方法被调用两次?
- java基础(8)---接口
- VHDL std_logic_vector索引与“downto”
- JSP JSTL <x:forEach>标签:遍历XML文件
- ThreadPoolExecutor线程池任务执行失败的时候会怎样
- Android客户端采用Http 协议Post方式请求与服务端进行数据交
- java – 使JTable单元不可编辑
- java – 如何在返回多种类型的XML的URL上使用Spring RestTe
- MyBatis中传入参数parameterType类型详解
- 将Java文档添加到导出jar的Eclipse Project中