Java 把手用斜杠替换文字

Java handlebars to replace a literal with slash

我想在 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"

The official HashMap documentationHashMap#put 的 return 值的说明如下:

Returns: the previous value associated with key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with key.)

这意味着 new HashMap<>().put("bar", "fooValue") 将始终计算为 null。

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

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

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

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