Java の「関数型インターフェース」とは抽象メソッドが1つだけの抽象クラスのことで、これを使って定義した変数には関数をオブジェクト化した「関数オブジェクト」を代入出来ます。

と言っても良く分からないと思うので、ソースコードを見ながら具体的に使い方を説明します。
なおこの関数型インターフェースには様々な種類がありますが、今回は「Runnable」と「Function」インターフェースについて説明します。

まず前提として、

・ Runnable インターフェースを使って定義した変数には「引数を持たない void 型の関数オブジェクト」を代入できます。

・ Function インターフェースを使って定義した変数には「引数が1つで戻り値を持つ関数オブジェクト」を代入できます。

例えば、Runnable インターフェースの変数 runnable と、引数が Integer 型、戻り値が String 型である Function インターフェースの変数 function はソース 1 のようにして定義します。 なお Runnable インターフェースを使いたい時は java.lang.Runnable を、Funtion インターフェースを使いたい時は java.util.function.Function をインポートします。

ソース1: Runnable と Function インターフェースを使った変数の定義例
import java.lang.Runnable;
import java.util.function.Function;
 
public class Main{

    public static void main(String[] args) {

        Runnable runnable;
        Function< Integer, String > function;
    }
}

この様にして作った runnable や function には、次のソース 2 の様にして関数を代入できます。

ソース2: 関数(関数オブジェクト)の代入
import java.lang.Runnable;
import java.util.function.Function;
 
public class Main{

    public static void myrunnable(){
        System.out.println("hoge");
    }

    public static String myfunction( Integer a ){
        return "piyo="+a;
    }

    public static void main(String[] args) {

        Runnable runnable;
        Function< Integer, String > function;

        runnable = Main::myrunnable;
        function = Main::myfunction;
    }
}

上の例では runnable と function にそれぞれ myrunnable 関数と myfunction 関数を代入しています。
すると runnable と function を経由して次のソース 3 の様に myrunnable 関数と myfunction 関数を呼び出す事が出来ます。

ソース3: 代入した関数を呼び出す
import java.lang.Runnable;
import java.util.function.Function;
 
public class Main{

    public static void myrunnable(){
        System.out.println("hoge");
    }

    public static String myfunction( Integer a ){
        return "piyo="+a;
    }

    public static void main(String[] args) {

        Runnable runnable;
        Function< Integer, String > function;

        runnable = Main::myrunnable;
        function = Main::myfunction;

        runnable.run();  // myrunnable 関数の呼び出し

        String str = function.apply( 123 ); // myfunctionの呼び出し(引数は123)
        System.out.println( str );
    }
}

runnable に代入した関数を呼び出す時は Runnable.run メソッドを使います。
また function に代入した関数を呼び出す時は Function.apply メソッドを使います。

したがって上のソース3の結果は以下となります。

ソース3の実行結果
hoge
piyo=123

なお、代入する関数はコードの途中で切り替えることも可能です。
例えば次のソース4の様なコードを書くことも出来ます。

ソース4: 代入する関数を切り替える
import java.lang.Runnable;
 
public class Main{

    public static void myrunnable1(){
        System.out.println("hoge");
    }

    public static void myrunnable2(){
        System.out.println("fuga");
    }

    public static void myrunnable3(){
        System.out.println("piyo");
    }

    public static void main(String[] args) {

        Runnable runnable;

        runnable = Main::myrunnable1;
        runnable.run();

        runnable = Main::myrunnable2; // 関数オブジェクトを再代入
        runnable.run();

        runnable = Main::myrunnable3; // 関数オブジェクトを再代入
        runnable.run();
    }
}

ソース4の実行結果
hoge
fuga
piyo