2017-05-13 12 views
5

私はJava 8にコードをリファクタリングしており、nullチェックをOptionalに置き換えたいと考えています。Java 8戻り値nullを返す

public Employee findEmployeeById(String id) { 
    List<Employee> empList = .. //some db query 
    return (empList.isEmpty() ? null : empList.get(0)); 
} 

Optional.ofNullable(empList.get(0))それはIndexOutofBoundException

をスローしますまたは私は理想的Optional.empty()をnullに置き換える必要があるときのように動作しないのだろうか?

+0

クエリが最初に1つの結果しか返さないのはなぜですか? – Marvin

+0

それは複雑な論理です....左の結合とすべての....私はあなたがポイントを理解するが、実際にはそれを変更することはできません – coder25

+6

'return empList.isEmpty()? Option.empty():オプション.of(empList.get(0)); ' – Jesper

答えて

9

@Jesperは既にコメントに記載されているので、リストが空であるかどうかをチェックしてから、空のOptionalを返します。 Optional

public Optional<Employee> findEmployeeById(String id) { 
    List<Employee> empList = .. //some db query 
    return empList.isEmpty() ? Optional.empty() : Optional.of(empList.get(0)); 
} 

は、あなたがそれを使用するときに、明示的にnullのチェックを回避することができ、潜在的null値のラッパーです。

Optional documentationをご覧ください。それが不在だ場合はnullをチェックせず、従業員の名前を取得したり、「不明」ができる。例えば

Optional<Employee> emp = findEmployeeById(id); 
String name = emp.map(Employee::getName).orElse("unknown"); 

あなたがOptionalを使用することは理にかなっているかどうかを確認するためにthis post about Uses for Optionalを読むことができます。

3

は、なぜあなたは単にであなたの方法に代わるものではありません。

public Optional<Employee> findEmployeeById(String id) { 
    List<Employee> empList = .. //some db query 
    return (empList.isEmpty() ? Optional.empty() : 
       Optional.ofNullable(empList.get(0))); 
} 

私はあなたがそれがまだヌルであるかもしれない場合にはOptional.ofNullableempList.get(0)をラップ示唆しています。

までなぜが良いですか:メソッドの呼び出し側について考えてみてください。誰でもあなたのメソッドを呼んでいますは、結果がemptyのときに実際に何をするかをと考える必要があります。あなたが好きな、より流暢になるため、これを連鎖もでき

Optional<Employee> emp = findEmployeeById("12"); 

if (emp.isPresent()) { 

} else { 
    .... 
} 

emp.orElseThrow(RuntimeException::new) 

またはその他の任意の方法あなたが書き込みのようなコードになりまし強制あるほか

従業員を返却すると、それは単純にケースになりません。参照がnullであるかどうかを(通常は)確認することさえ考えていません。

これは、コードのエラーを起こしにくく、理解しやすくします。

2

別の可能性としては、次のようにそれを行うには、次のようになります。

return Optional.of(empList).filter(list -> !list.isEmpty()).map(list -> list.get(0)); 

これは自動的にリストが空の場合には、空のOptionalを返しますかempList.get(0)戻りnull

empListnullの場合は、Optional(empList)の代わりにOptional.ofNullable(empList)を使用することを検討してください。

5

私には、? :の構造をFloern’s answerのままにしておくのが自然な解決策です。しかし、あなたはそれを取り除くしたい場合は、それなしにもエレガントな解決策があります:これはfindFirst()Optionalを返すので、何をしたいあなたを与える

public Optional<Employee> findEmployeeById(String id) { 
    List<Employee> empList = .. //some db query 
    return empList.stream().findFirst(); 
} 

。あなたが得る要素が気にしない場合、または複数の要素がないことがわかっている場合は、代わりにfindAny()を使用することもできますが、Optionalも返します。

+0

良いこと、それについて考えなかった – Floern

+2

ニース! 'empList'ローカルは必要ないので、これを' return someDbQuery()。stream()。findFirst() 'に減らすことができます。 –

関連する問題