Pattern Matcher の find()実行と group()実行、1つの処理文にする。

java.util.regex.Pattern
java.util.regex.Matcher
マッチした部分の抽出は、今まで良い考えが浮かばず、以下のように、
Matcher 変数宣言を強いられてきた。

String str = "HTTP   This request is Unauthorized    (401)";
Matcher m = Pattern.compile("\\([0-9]{3}\\)$").matcher(str);
String code = m.find() ? m.group(0) : null;

・Matcher 変数宣言すること。
・処理文が2つになること。
これが嫌で嫌でたまらなかった。
========================
下の方、取消線を書いたが、もっと良い綺麗に書く方法がある。
============
Optional で filter を使えば良い!

String code =	Optional.of(Pattern.compile("\\([0-9]{3}\\)$").matcher(str))
.filter(e->e.find()).map(e->e.group()).orElse(null);
Integer value =	Optional.of(Pattern.compile("\\([0-9]{3}\\)$").matcher(str))
.filter(e->e.find()).map(e->e.group())
.map(e->Integer.parseInt(e.substring(1, 4)))
.orElse(null);

以下は、たいして良くない。
========================
Optional を使えば、Matcher 変数宣言なし、AND 処理文は1つ。になる。

String code = Optional.of(Pattern.compile("\\([0-9]{3}\\)$").matcher(str))
.map(e->new Object[]{e.find(), e})
.map(e->Boolean.valueOf(e[0].toString()) ? ((Matcher)e[1]).group() : null)
.orElse(null);

"(401)" → 401 整数を抽出したければ、、

Integer val = Optional.of(Pattern.compile("\\([0-9]{3}\\)$").matcher(str))
.map(e->new Object[]{e.find(), e})
.map(e->Boolean.valueOf(e[0].toString()) ? ((Matcher)e[1]).group() : null)
.map(e->Integer.parseInt(e.substring(1, 4)))
.orElse(null);

これらは、Java Pythonのタプルが存在しないから、Matcher find() 結果 boolean find()後の
Matcher インスタンス
を Object[] に突っ込んでいるが、、
ペア構造のクラス、Map.Entry の実装に突っ込むようにすれば、
この Optional で実行する map も次のように綺麗なる。

ICU4J というのを使います。
International Components for Unicode の略で、Java文字コード変換ライブラリに
ある Pair<T, U> を使えば、この問題も綺麗になります。
site.icu-project.org
日本語の解説サイトは古いのしかないけど、決して開発が止まってるわけでもなさそうです。
ライブラリ最新は、去年10月に出ています。

JARを Maven で取得します。

<dependency>
  <groupId>com.ibm.icu</groupId>
  <artifactId>icu4j</artifactId>
  <version>63.1</version>
</dependency>

PDF帳票出力フレームワーク Jasperreports は、これを使っています。
取得したら、
com.ibm.icu.impl.Pair<F, S>
を使います。
総称型 F は、First で、Sは、Second ,1番目の要素と2番目の要素ということです。
インスタンス生成は、of メソッドで、要素へのアクセスは、getter ではなく public 変数を直接読込みです。
public final 宣言なので、インスタンス生成後は書き込めません。

Pair を使用すると以下のように書けます。

import com.ibm.icu.impl.Pair;
String code = Optional.of(Pattern.compile("\\([0-9]{3}\\)$").matcher(str))
.map(e->Pair.of(e.find(), e))
.map(e->e.first ? e.second.group() : null)
.orElse(null);
Integer val = Optional.of(Pattern.compile("\\([0-9]{3}\\)$").matcher(str))
.map(e-> Pair.of(e.find(), e))
.map(e->e.first ? e.second.group() : null)
.map(e->Integer.parseInt(e.substring(1, 4)))
.orElse(null);