Java で、Snake case ⇔ Camel case

先日、Python で処理する Snake case ⇔ Camel case を書いた。
Python で snake case → camel case - Oboe吹きプログラマの黙示録

Python で camel case → snake case - Oboe吹きプログラマの黙示録

では、Java の場合、これもネット検索すると沢山いろんな方法が紹介されてる。
google guava なんか使わずに、Java8 で書くと、、、

Camel case ⇒ Snake case
これは、正規表現の処理で簡単に済む。
例)

String camel = "firstName2ByAbc";
String snake = camel.replaceAll("([a-z0-9]+)([A-Z]+)", "$1_$2").toUpperCase();

結果

FIRST_NAME2_BY_ABC

Snake case ⇒ Camel case
"_" で split して処理するのが最も素直であろう。ただ処理ループがいろんな方法あると思うが、
Java8 Stream で処理するように書くと、
以前、投稿した、
Stream で処理する正規表現 - Oboe吹きプログラマの黙示録
あるいは、
Git-hub に入れた
https://github.com/yipuran/yipuran-core/blob/master/src/main/java/org/yipuran/regex/RegExpress.java
の中の replace メソッドを参考に、 Camel case への変換用メソッドを用意することができる。
Snake case 文字列を対象にするのが前提。。

public static String toCamelcase(String string){
   Matcher m = Pattern.compile("_[a-zA-Z]").matcher(string);
   BiFunction<String, Integer, String> f = (s, i)->i==0 ? s.replaceAll("_", "")
                                            : s.substring(1, 2).toUpperCase();
   AtomicInteger i = new AtomicInteger(0);
   AtomicInteger x = new AtomicInteger(0);
   return StreamSupport.stream(Spliterators.spliteratorUnknownSize(new Iterator<String>(){
      @Override
      public boolean hasNext(){
         return m.find();
      }
      @Override
      public String next(){
         return string.substring(i.getAndSet(m.end()), m.start())
               + f.apply(m.group(), x.getAndIncrement());
      }
   }, Spliterator.ORDERED), false).collect(Collectors.joining()) + string.substring(i.get());
}

もう1つ、↑の方法ではなく、読みにくいけど、正規表現⇒splitAsStream⇒Optional の方法

String camel = Optional.of(Pattern.compile("_").splitAsStream(snake.toLowerCase())
.filter(e->e.length() > 0).collect(StringBuilder::new
, (r, t)->r.append(t.substring(0, 1).toUpperCase()).append(t.substring(1))
, (r, t)->{}).toString())
.map(e->e.substring(0, 1).toLowerCase() + e.substring(1)).get();

これなら、わざわざメソッドを用意しなくて良い。

Snake case ⇒ Camel case が意外と複雑になってしまう。