2016-09-25 10 views
6

私は静的メソッドString Converter.convert(String, Integer)を持っています。2つのパラメータを受け取る関数を使用して、Java 8ストリームを使用してマップのキー+値を新しい値に変換する方法?

私はまたマップ:Map<String, Integer> mapを持っています。

私はマップを実行し、変換メソッドを使用して各エントリを文字列に変換し、変換された各文字列を使用していきたいと考えています。

map.entrySet().stream().map(e -> Converter.convert(e.getKey(), e.getValue()))....;

それがより直感的に行う方法があります:

私は、このようにそれを行うことができますか?次のようなものがありますか?

map.stream(Converter::convert)... ???

または

map.stream((k, v) -> Converter.convert(k, v)))... ???

+1

ない:それはStream<Entry<K, V>>を実装し、必要なものですmapKeyValueを含む追加の便利な方法を提供し、特別なクラスEntryStream<K, V>が含まれています。あなたは 'Entry'を取り、あなたの' convert'メソッドを呼び出すメソッドを定義することができます。 'Map.forEach'は' BiConsumer'を取りますが、何も返さないのであまり役に立ちません。 –

+0

私はそこに欲しかった! –

答えて

0

これはあなたが手に入れようとしているほどです。

Converter::convertメソッドは、引数としてMap.Entry<String, Integer>が必要な場合に機能します。私はそれが地図以外のコンテキストであなたのコンバータを使用することに悪影響を与えるので、これに反対してお勧めします。

Map.forEachメソッドを使用すると、2つの引数を持つラムダの提案は機能しますが、操作の種類には使用できません。あなたのストリームを取る時までには、あなたはStream<Map.Entry<String, Integer>>です。 2つの引数をとるラムダはこの文脈では意味をなさないかもしれませんが、コンパイラがMap.Entryを2つの引数に変換する方法を知る方法はありません。

5

あなたはこのようないくつかのユーティリティクラスのアダプタの静的メソッドを作成することができます代替ソリューションを使用することです

import static Functions.*; 

map.entrySet().stream().map(entryFunction(Converter::convert))... 

public class Functions { 
    public static <K, V, R> Function<Map.Entry<K, V>, R> entryFunction(
      BiFunction<? super K, ? super V, ? extends R> fn) { 
     return entry -> fn.apply(entry.getKey(), entry.getValue()); 
    } 
} 

今、あなたはこのようにそれを使用することができますJava 8 Stream APIを拡張したサードパーティのライブラリ。そのような図書館の1つは私が書いた無料のStreamEx図書館です。本当に

EntryStream.of(map).mapKeyValue(Converter::convert)... 
関連する問題