computeIfPresentという便利なやつ


どんな役割か

指定されたキーの値が存在していてnull以外の場合、キーと現在マップされている値から新しいマッピングの計算を試みます。
関数がnullを返した場合、マッピングは削除されます。関数自体が(非チェック)例外をスローした場合、その例外は再スローされ、現在のマッピングは変更されません。

なるほど。

コードで見る

  • 使わなかった場合
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Map<String, String> map = new HashMap<>();
        map.put("hoge", "hoge");
        map.put("fuga", "fuga");
        map.put("piyo", "piyo");

        if (map.get("piyo") != null) {
            map.put("piyo", "piyopiyo");
        }

        System.out.println(map.get("piyo"));
    }
}

piyoというキーがmapあったら、それに対応するバリューをpiyopiyoにします。

  • 使った場合
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Map<String, String> map = new HashMap<>();
        map.put("hoge", "hoge");
        map.put("fuga", "fuga");
        map.put("piyo", "piyo");

        map.computeIfPresent("piyo", (k, v) -> "piyopiyo");

        System.out.println(map.get("piyo"));
    }
}

やっていることはさっきと同じですが、スッキリしますね。
余計なif文が無いのは素晴らしいことです。

  • こんな事もできる
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Map<String, String> map = new HashMap<>();
        map.put("hoge", "hoge");
        map.put("fuga", "fuga");
        map.put("piyo", "piyo");

        map.computeIfPresent("piyo", (k, v) -> {
            if (v.equals("piyo")) {
                return "piyopiyo";
            }
            return "piyo";
        });

        System.out.println(map.get("piyo"));
    }
}

piyoというキーがmapにあった場合、もしそのバリューがpiyoであればpiyopiyoに上書きします。
バリューがpiyoではなかった場合はpiyoに上書きします。

まとめ

コードレビューでこれを使ったほうがキレイになるよ。と指摘された内容ですが、知らないメソッドだったので備忘録としてまとめました。
Java8から追加されたようなので結構実装自体は昔ですね。
みんなもドキュメントを、読もう!(私も読みます)