1. ホーム
  2. java

Java 8 ストリームマップ オン エントリーセット

2023-10-15 04:13:39

質問

の各エントリに対してマップ操作を行おうとしています。 Map オブジェクトの各エントリに対してマップ操作を行おうとしています。

キーからプレフィックスを取り除き、ある型から別の型に値を変換する必要があります。私のコードでは、設定エントリーを Map<String, String> に変換し、さらに Map<String, AttributeType> ( AttributeType は、ある情報を保持しているだけのクラスです。それ以上の説明はこの質問には関係ありません)。

Java 8 Streamsを使って私が思いついたベストは次のようなものです。

private Map<String, AttributeType> mapConfig(Map<String, String> input, String prefix) {
   int subLength = prefix.length();
   return input.entrySet().stream().flatMap((Map.Entry<String, Object> e) -> {
      HashMap<String, AttributeType> r = new HashMap<>();
      r.put(e.getKey().substring(subLength), AttributeType.GetByName(e.getValue()));
      return r.entrySet().stream();
   }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

を構築することができないので Map.Entry を作成することができないため、単一エントリである Map インスタンスが生成され flatMap() を使用するのは醜いように思えます。

より良い代替案はありますか?forループを使用してこれを行う方がきれいに思えます。

private Map<String, AttributeType> mapConfig(Map<String, String> input, String prefix) {
   Map<String, AttributeType> result = new HashMap<>(); 
   int subLength = prefix.length(); 
   for(Map.Entry<String, String> entry : input.entrySet()) {
      result.put(entry.getKey().substring(subLength), AttributeType.GetByName( entry.getValue()));
   }
   return result;
}

この場合、Stream APIは使わない方がいいのでしょうか?それとも私が見逃しているもっと良い方法があるのでしょうか?

どのように解決するのですか?

古いfor loopの方法をストリームに置き換えるだけです。

private Map<String, String> mapConfig(Map<String, Integer> input, String prefix) {
    int subLength = prefix.length();
    return input.entrySet().stream()
            .collect(Collectors.toMap(
                   entry -> entry.getKey().substring(subLength), 
                   entry -> AttributeType.GetByName(entry.getValue())));
}