throwable な Function を使うケース

先日の Jackson 使用する JSON解析の方法では、
oboe2uran.hatenablog.com

JSON構造の中階層のキーを任意クラス型に変換させる場合、
ObjectMapper から com.fasterxml.jackson.databind.ObjectReader を取得して、
readValue(JsonNode) メソッドを実行すれば、目的の型インスタンス
解析結果を得ることができるのだが、この readValue メソッドが
throws IOException 宣言のメソッドなので、どうしても例外捕捉記述が必要になる。

JSON キー group の配列の中に、Foo クラスに解析したいものが並んでいる場合のデシリアライザ登録

JsonNodeParse jparse = new JsonNodeParse();
jparse = jparse.addDeserilaize(Pattern.compile("group\\[\\d+\\]"), n->{
	try{
		return new ObjectMapper().readerFor(Foo.class).readValue(n);
	}catch (IOException e){
		return null;
	}
});

これは、ちょっと長い。
そこでこれを簡潔するにするのが、Throwable な Function を用意して使用する方法である。
yipuran-core ライブラリに入れておいた
throwable な Function
https://github.com/yipuran/yipuran-core/blob/master/src/main/java/org/yipuran/function/ThrowableFunction.java
を使用することだ。

jparse = jparse.addDeserilaize(Pattern.compile("group\\[\\d+\\]"), 
            ThrowableFunction.of(new ObjectMapper().readerFor(Foo.class)::readValue));

にする。

このラムダを使用する際、Jackson の ObjectReader は、くれぐれも、readerForUpdating(T) を使わないように
気をつけないと思わぬ落とし穴が待っているので注意が必要。

ThrowableFunction の代わりにJsonNodeParse に以下の staticメソッドを追加して、
記述しても良いかもしれない。。。
JsonNodeParse に追加するメソッド

public static Function<JsonNode, Object> toFunction(Class<?> cls){
   return  t->{
      try{
         return new ObjectMapper().readerFor(cls).readValue(t);
      }catch(Throwable ex){
         throw new RuntimeException(ex);
      }
   };
}

以下のように簡潔になる。

jparse = jparse.addDeserilaize(Pattern.compile("group\\[\\d+\\]"), JsonNodeParse.toFunction(Foo.class));