首页 > 解决方案 > 用斜杠替换文字的 Java 把手

问题描述

我想在java中使用handlerbars(com.github.jknack)来替换字符串中的值,如下所示:

@Test
public void handlebarTest() throws IOException {
  var map = new HashMap<String, Object>();
  var input = "testing handlerbars {{ test }} - {{ foo/bar }}";
  var handlebars = new Handlebars();
  map.put("test","testValue");
  map.put("foo", new HashMap<>().put("bar", "fooValue")); //does not work
  map.put("foo/bar", "fooValue"); //does not work
  Template template = handlebars.compileInline(input);
  var result = template.apply(map);

  System.out.println(result);
}

这个测试的输出是: testing handlerbars testValue -

预期的输出将是: testing handlerbars testValue - fooValue

当文字是简单的 ( {{ test }}) 时,替换工作正常,但当文字包含斜线 ( ) 时,它不起作用{{ foo/bar }}。有没有办法用车把替换"foo/bar"字符串"fooValue"

标签: javahandlebars.jshandlebars.java

解决方案


HashMap 官方文档说明了以下关于 的返回值HashMap#put

返回:与 key 关联的前一个值,如果没有 key 映射,则返回 null。(返回 null 还可以指示映射先前将 null 与 key 关联。)

这意味着new HashMap<>().put("bar", "fooValue")它将始终评估为空。

为了解决这个问题,您当然可以执行以下操作:

var fooMap = new HashMap<String, String>();
fooMap.put("bar", "fooValue");
map.put("foo", fooMap);

但是,从 Java 9 开始,最常见的集合(Set、List 和 Map)都有静态工厂方法。使用这些新的工厂方法,您可以new HashMap<>().put("bar", "fooValue")Map.of("bar", "fooValue")which 创建一个不可变的Map 与一个条目 ( "bar"-> "fooValue") 替换。

这应该可以正常工作,因此您可以安全地删除该行map.put("foo/bar", "fooValue"); // does not work


推荐阅读