2016-04-19 6 views
2

私は以下のコードを吹き込みました。私はif (something.isPresent())行を避け、Optional<Something> somethingを宣言する方法を見つけようとしました。代わりにOptional.orElse()メソッドをチェーンして結果を直接返したいと思います。しかし、メソッドが見つからない場合にメソッドがnullを返す必要があるので、方法を見つけることができないようです。もし見つかった場合は、メソッドを呼び出してから戻る必要があります。結果に対してメソッドを呼び出す必要があるときにorElseを使用するには?

良い方法がありますか?

import java.util.ArrayList; 
import java.util.List; 
import java.util.Optional; 

public class OrElseWhat { 

    private class Something { 
     private String it; 
     Something(String it) { this.it = it; } 
     String getIt() { return it; } 
    } 

    private List<Something> somethings = new ArrayList<Something>() { 
     { 
      add(new Something("one")); 
      add(new Something("two")); 
      add(new Something("three")); 
     } 
    }; 

    public String getFourOrNull() { 
     Optional<Something> something = somethings.stream() 
       .filter(s -> s.getIt().equals("four")) 
       .findAny(); 

     if (something.isPresent()) { 
      return something.get().getIt(); 
     } 

     return null; 
    } 
} 

答えて

3

あなたの値はOptional形で残っている間は、mapを使用してメソッドを呼び出すことができます:

public String getFourOrNull() { 
    return somethings.stream() 
      .filter(s -> s.getIt().equals("four")) 
      .findAny() 
      .map(Something::getIt) 
      .orElse(null); 
} 

mapsさんdocumentationから:

値が存在する場合、適用されますそれにマッピング関数を提供し、結果がnullでない場合は、結果を記述するOptionalを返します。それ以外の場合は空を返します。あなたは、@Aaronに耳を傾け、getFourOrNullOptionalを返すようにorElseをドロップすることができれば、と述べ

Optionalが使用されているコードベースには、nullを返すメソッドはありません。

+0

素晴らしい!私は地図がNPEを得ると思ったが、彼らはそれについても考えていたと思う。 – uzilan

2

私はあなたのメソッドの署名をOptional<String>に変更し、常にsomethingを返すべきだと思います。

Optionalは、このような場合のために行われました。彼らは(?多分それはnullまたは""または-1です)いくつかの非特定の値を返す回避することが可能になるとかなりはっきり多分あなたはなるだろうというあなたの署名から始まる説明します何らかの型を返すことができるが、必ずしもそうではない。

+0

私は知っている。残念ながら私はこのケースではオプションを返すことはできません。誰でも使用するにはnullが必要です。 – uzilan

関連する問題