Java 8では、関数型インターフェイスの概念と、関数型インターフェイスを取るように設計された多数の新しいメソッドが追加されました。これらのインターフェースのインスタンスは、メソッド参照式(例SomeClass::someMethod
)とラムダ式(例(x, y) -> x + y
)を使用して簡潔に作成できます。
同僚と私は、どちらのフォームを使用するのが最適かについて意見が異なります(この場合、「最適」は、「最も読みやすい」と「標準的な慣行に最も近い」に要約されます。同等)。具体的には、次のすべてが当てはまる場合です。
- 問題の関数は単一のスコープの外では使用されません
- インスタンスに名前を付けると、読みやすさが向上します(たとえば、ロジックが何が起こっているかを一目で確認できるほど単純であるのとは対照的)
- ある形式が他の形式よりも好まれるプログラミング上の理由は他にはありません。
この問題についての私の現在の意見は、プライベートメソッドを追加し、それをメソッド参照で参照することが、より優れたアプローチであるというものです。これはこの機能がどのように使用されるように設計されているかのように感じられ、メソッド名とシグネチャを介して何が起こっているかを伝える方が簡単に思われます(たとえば、「boolean isResultInFuture(Result result)」は明らかにブール値を返すと言っています)。また、クラスの将来の拡張で同じチェックを利用したい場合に、プライベートメソッドを再利用しやすくしますが、機能インターフェイスラッパーは必要ありません。
私の同僚の好みは、インターフェイスのインスタンスを返すメソッドを用意することです(たとえば、 "Predicate resultInFuture()")。私には、この機能の使用方法が完全ではないように感じられ、少し不格好に感じられ、名前を付けることで意図を実際に伝えるのが難しいように思われます。
この例を具体的にするために、異なるスタイルで記述された同じコードを次に示します。
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
results.filter(this::isResultInFuture).forEach({ result ->
// Do something important with each future result line
});
}
private boolean isResultInFuture(Result result) {
someOtherService.getResultDateFromDatabase(result).after(new Date());
}
}
対
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
results.filter(resultInFuture()).forEach({ result ->
// Do something important with each future result line
});
}
private Predicate<Result> resultInFuture() {
return result -> someOtherService.getResultDateFromDatabase(result).after(new Date());
}
}
対
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
Predicate<Result> resultInFuture = result -> someOtherService.getResultDateFromDatabase(result).after(new Date());
results.filter(resultInFuture).forEach({ result ->
// Do something important with each future result line
});
}
}
1つのアプローチの方が望ましいか、言語設計者の意図に沿ったものか、または読みやすいかについて、公式または準公式のドキュメントまたはコメントはありますか?公式の情報源を除いて、1つがより良いアプローチになる理由が明確にありますか?
Object::toString
。したがって、私の質問は、この特定のタイプのインスタンスの方が、ここでレイアウトしている方が、一方が他方より優れているインスタンスが存在するのか、またはその逆であるのかよりも重要です。