先日、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-Z0-9]").matcher(string); AtomicInteger i = 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()).toLowerCase() + string.substring(m.start()+1, m.end()).toUpperCase(); } }, 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 が意外と複雑になってしまう。