私は、NULL値を処理するためのオプションを使用したい、私が行うための最善の方法は何かを考えることはできません「トリッキー」の部分は、 - 値がnullの場合、私はロギングを行いたいということです。私は、コードを次のようにそれを達成することができます - それはぎこちない感じています。
(アップデート:私は、Java 9からオプションで、私自身の答えを掲載しています)
このように言うのコードのルックスをすることができます:
// logLine.getSomeProperty returns Optional<String>
List<LogDetails> logDetails = logLine.getSomeProperty()
.map(this::extractLogDetails)
.orElseGet(() -> logError(logLine));
List<LogDetails> extractLogDetails(String s) {
List<LogDetails> logDetails = new ArrayList<>();
String sp = "(?:([A-Z0-9]{5,7})-([A-Z0-9]{9})-(.{4}))";
Pattern p = Pattern.compile(sp, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(s);
while (m.find()) {
logDetails.add(new LogDetails(m.group(1), m.group(2), m.group(3)));
}
return logDetails;
}
List<LogDetails> logError(LogLine logLine) {
log.error("Error while ... {} ", logLine));
persistence.setErrorStatus(logLine, FAILED_PARSING);
return new ArrayList<>();
}
それは私がやりたいだろうが、私はそれにはいくつかの「問題」を持っています。
- 私はそれが奇妙な、と呼ばれるその方法が見つかっ
orElseGet
たエラーを記録するために使用されています。 - 私はそこorElseThrowとのlogErrorでorElseGetを置き換えることができますし、何も捨ててはいけない - 私はどちらか好きではありません。
- logErrorメソッドは、私が使用していないリストを返し、それが無効であるべき方法から何かを返すように奇妙に見えます。
- 単純に良い方法がなければなりません
- somePropertyがnullではありませんが、一致がないケース - 私は同様にログインしたいのですが、そのために私がいるかどうかを確認するために、コードの別の行が必要になります
logDetails.size() == 0
orElseGet
本当にエラー処理メカニズムとして意図したものではなく、場合には、異なるデフォルト値を生成する方法として、されていないOptional
場合は、任意のを運んでいませんが。
どうかをチェックしたい場合はOptional
、明示的に空になって、単に使用Optional.isPresent()
のチェックをしてくださいlogError()
、その場合には。
場合は、あなたが最初に考える必要があるOptional
空で、何をやりたいのですか?別にエラーをログから、あなたは空のリストを続行しますか?
そうなら、あなたはこのような何かを持っていることができます:
List<LogDetails> logDetails = logLine.getSomeProperty()
.map(this::extractLogDetails)
.orElseGet(Collections::emptyList);
あなたが行うことができた後:
if (logDetails.isEmpty()) {
logError(logline);
}
あなたがすべてで空のリストを持ってしたくない場合は別の方法として、オプションのレベルで物事を保つことができます。このように、どちらの場合もここでgetSomeProperty()
空であるか、または生成されたリストが空の場合と同じ方法で処理されます。
Optional<List<LogDetails>> logDetailsOpt = logLine.getSomeProperty()
.map(this::extractLogDetails)
.filter(list -> !list.isEmpty());
if (!logDetailsOpt.isPresent()) {
logError(logLine);
}
どちらの場合も、logError()
何も返さないと予想されます。エラーをログに記録する、その名に行うことを目的としているものをやっています。
むしろの機能を酷使しようとするよりもOptional
、あなたのコード内のあなたの意図を明確にしてみてください。読みやすさでより多くの価値があります。