コールバックによる文字列置換をする方法が Java の標準ライブラリには無いようだ。
無いと困るので、適当にでっちあげた。

import java.util.regex.Matcher;

import java.util.regex.Pattern;


@FunctionalInterface

interface RegexpReplaceUtilCallback {

public String call(Matcher matcher);

}


/**

 * import static RegexpReplaceUtil.*;

 * 

 * String replacement with lambda.

 * 

 */

class RegexpReplaceUtil {

    /**

     * replaceOnce("hoge${var}", Pattern.compile("\\$\\{.*?\\}"), (m) -> {

     * return vars.get(m.group(1));

     * });

     * 

     * @param str

     * @param pattern

     * @param callback

     * @return

     */

    public static String replaceOnce(String str, Pattern pattern, RegexpReplaceUtilCallback callback){

        Matcher m = pattern.matcher(str);

        StringBuffer sb = new StringBuffer(str.length());

        if(m.find()){

            m.appendReplacement(sb, callback.call(m));

        }

        m.appendTail(sb);

        return sb.toString();

    }

    

    /**

     * replaceAll("hoge${var}", Pattern.compile("\\$\\{.*?\\}"), (m) -> {

     * return vars.get(m.group(1));

     * });

     * 

     * @param str

     * @param pattern

     * @param callback

     * @return

     */

    public static String replaceAll(String str, Pattern pattern, RegexpReplaceUtilCallback callback){

        Matcher m = pattern.matcher(str);

        StringBuffer sb = new StringBuffer(str.length());

        while(m.find()){

            m.appendReplacement(sb, callback.call(m));

        }

        m.appendTail(sb);

        return sb.toString();

    }

}
appendReplacemnt と appendTail を直接使ってもいいと思う。