2017-06-15 1 views
5

私のコントロール下にないサービスから、nullの可能性があるマップを取得し、処理したいと思います。フィルタ、マップ、必要な要素を減らしたいと思います。オプションの内容に基づいたストリームを使用する<Map>

質問:オプションからストリームへのリンクはありますか?

私は(他のものの間で)試してみました:

return Optional.ofNullable(getMap()) 
    .map(Map::entrySet) // gets the entryset 
    .map(Stream::of) 
    .orElseGet(Stream::empty) 
    // i would then like to continue with 
    .filter(e -> e.getKey().startsWith("f") 
    .map(Entry::getValue) 
    .findFirst(); 

をその後私はStream<Entry>ない得るが、Stream<Set<Entry>> ...何とかflatMapコレクションにまたはオプションの外にマッピングする方法はありますか?

注:ここでは流暢で純粋なストリーム/オプションのアプローチに興味があります。もちろん、マップをローカル変数に保存してからnullになっていないか確認してください。

+0

キャストストリームからストリーム?いいえ、私はできません。 –

+7

'getMap()'を 'null'の代わりに空のマップを返すように変更することを検討するべきでしょう。あなたはそれを 'Optional'で囲むことはできません。そうすれば、簡単にそのような問題を避けることができます。 [Stuart Marks](https://stackoverflow.com/users/1441122/stuart-marks)によると、[Rule#4:その方法をチェーン化するという特定の目的のためには、 ](https://youtu.be/Ej0sss6cq14?t=27m55s)。 –

+3

Java 9では、['Optional'は' stream() 'メソッドを持ちます](http://download.java.net/java/jdk9/docs/api/java/util/Optional.html#stream--)あなたは単純に次のようにすることができます: 'Optional.ofNullable(getMap())。map(Map :: entrySet).stream()。flatMap(Set :: stream)...' –

答えて

8

あなたの間違いは、この行である:

.map(Stream::of) 

of機能は、単一のパラメータ(または可変引数パラメータ)を取り、そして唯一のその要素にストリームを返します。したがって、Stream<Set<Map.Entry>>が得られます。代わりに、次のようにentrysetのストリームメソッドを呼び出す必要があります。

.map(Set::stream) 
0

私は質問に答えようと思います。

return Optional.ofNullable(getMap()) 
    .map(Map::entrySet) // gets the entryset 
    .map(Stream::of) 
    .orElseGet(Stream::empty) 
    // i would then like to continue with 
    .filter(e -> e.getKey().startsWith("f") 
    .map(Entry::getValue) 
    .findFirst(); 

私は上記のコードを見たときに病気になりました。シンプルなコードを記述するのではなく、流暢なアプローチでコードを書くことは本当に重要ですか?まず第一に、@ Didier Lがコメントで述べたように、それはOptionalを使用する間違った方法です。第二に、コードは読みにくいですね。ローカル変数を定義して書いた場合:

Map<String, Integer> map = getMap(); 

return map == null ? Optional.<Integer> empty() 
        : map.entrySet().stream() 
         .filter(e -> e.getKey().startsWith("f")).map(Entry::getValue).findFirst(); 

あまり明確ではありませんか?常に物事が立ち往生している場合は、より良いアプローチを探ししようとして

StreamEx.ofNullable(getMap()) 
     .flatMapToEntry(Function.identity()) 
     .filterKeys(k -> k.startsWith("f")).values().findFirst(); 

またはマイライブラリAbacusUtil

EntryStream.of(getMap()).filterByKey(k -> k.startsWith("f")).values().first(); 

:あなたは流暢なアプローチを使用していない乗り越えることができない場合またはあなたはStreamExでそれを行うことができます。

関連する問題