2016-07-22 4 views
1

pipeline.findFirstでfindFirst()とmap()を使用することは有効ですか?mapは中間演算ですが、shortcircuitメソッドです。MapとFindFirst

this.list.stream().filter(t -> t.name.equals("pavan")).findFirst().map(toUpperCase()).orElse(null); 

上記のようなパイプラインでマップを使用することは有効ですか?

+0

あなたはそれを試して何が起こったのですか? 'map(t - > t.name.toUpperCase())'を使うとうまくいくかもしれません。 – Andreas

+1

また、 'list.stream()。map(t - > t.name).filter(n - > n.equals(" pavan "))を試すこともできます。findFirst()。map(String :: toUpperCase).orElse (ヌル) '。最初の 'map()'は中間ストリーム操作ですが、 'map()'はストリーム操作ではありません。それは 'オプション'の方法です。 – Andreas

+0

(無関係)orElse(null)を使用したくない場合は、結果としてOptionalを指定するだけです。 –

答えて

2

はい、あなたはです。は、findFirstの後にmapを使用します。ここで知るべき重要なことは、findFirst()がOptionalを返すため、オプションが値を持っているかどうか最初にチェックすることなく戻り値を単純に使うことはできません。以下のスニペットは、Personクラスのオブジェクトのリストを使って作業していることを前提としています。あなたがtoUpperCaseを使用していたところ、スニペットと

Optional<String> result = this.list.stream() 
    .filter(t -> t.name.equals("pavan")) // Returns a stream consisting of the elements of this stream that match the given predicate. 
    .findFirst() // Returns an Optional describing the first element of this stream, or an empty Optional if the stream is empty. If the stream has no encounter order, then any element may be returned. 
    .map(p -> p.name.toUpperCase()); // If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result. Otherwise return an empty Optional. 

// This check is required! 
if (result.isPresent()) { 
    String name = result.get(); // If a value is present in this Optional, returns the value, otherwise throws NoSuchElementException. 
    System.out.println(name); 
} else { 
    System.out.println("pavan not found!"); 
} 

つ以上のエラーでした。あなたのスニペットで渡されていた暗黙の引数はPersonクラスのオブジェクトでしたが、Stringが必要です。

関連する問題