微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在javax.scripting javascript环境中导入地图

我在 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);
}

原文地址:https://www.jb51.cc/java/121971.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐