Java8 - использовать функциональный интерфейс для замены потребителя или поставщика

Так как этот Consumer/Supplier/Predicate/UnaryOperator является только особым случаем функции, как я могу заменить эти interfacces на Function?

T → Функция → R

T → Потребитель → null

null → Поставщик → T

T → Predicate → boolean

T → UnaryOperator → T

null и boolean - это просто частный случай для T. Поэтому я пишу два случая, используя Function для замены Predicate и UnaryOperator.

Например:

private static void replacePredicate() {
    Function<String, Boolean> func = x -> x.startsWith("a");
    Predicate<String> pre = x -> x.startsWith("a");

    System.out.println(func.apply("ape"));
    System.out.println(pre.test("ape"));
}

private static void replaceUnaryOperator() {
    Function<Integer, Integer> func = x -> x * 2;
    UnaryOperator<Integer> uo = x -> x * 2;

    System.out.println(func.apply(6));
    System.out.println(uo.apply(6));
}

Но как я могу использовать функцию для замены Потребителя или Поставщика? Например, я хочу заменить Consumer, но код типа Function<String, null> func = x -> System.out.println(x); является незаконным.

Любое предложение будет принята с благодарностью ~

Ответ 1

A Consumer<T> можно рассматривать как Function<T, Void>. A Supplier<T> можно рассматривать как Function<Void, T>. Вам нужно будет вернуть null от вашего потребителя, записанного как функцию, и принять (и игнорировать) Void в качестве аргумента от вашего поставщика, написанного как функцию.

Не уверен, что я понял это.