Область действия в функциях более высокого порядка в Java 8 лямбда-синтаксисе Combinator Pattern - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь понять синтаксис в методе create следующего примера:

import java.math.BigDecimal;
import java.util.function.Consumer;
import java.util.function.Function;

@FunctionalInterface
interface Before<T, R> extends Function<Consumer<T>, Function<Function<T, R>, Function<T, R>>> {

    static <T, R> Before<T, R> create() {
        return before -> function -> argument -> {
            before.accept(argument);
            return function.apply(argument);
        };
    }

    static <T, R> Function<T, R> decorate(Consumer<T> before, Function<T, R> function) {
        return Before.<T, R>create().apply(before).apply(function);
    }
}

public class BeforeExample {

    void demo() {
        System.out.println("----------------------------------");
        System.out.println("Starting BEFORE combinator demo...");
        System.out.println("----------------------------------");

        Function<BigDecimal, String> addTax = this::addTax;

        Consumer<BigDecimal> before = this::before;

        Function<BigDecimal, String> addTaxDecorated = Before.decorate(before, addTax);

        BigDecimal argument = new BigDecimal("100");
        String result = addTaxDecorated.apply(argument);

        System.out.println("Done - Result is " + result);
        System.out.println();
    }

    private void before(BigDecimal argument) {
        System.out.println("BEFORE: Argument is " + argument);
    }

    private String addTax(BigDecimal amount) {
        System.out.println("Adding heavy taxes to our poor citizen...");
        return "$" + amount.multiply(new BigDecimal("1.22"));
    }
}

Может кто-нибудь объяснить, пожалуйста:

  • , что происходит в блок return before -> function -> argument -> {...} и то, как переменные before, function и argument становятся известными без видимой передачи в сигнатуру create, а также
  • , что означают кратные -> .

Спасибо.

1 Ответ

1 голос
/ 19 февраля 2020

что происходит в блоке return before -> function -> аргумент -> {...} и как переменные до, функция и аргумент становятся известными без передачи в

Следующий фрагмент кода может помочь вам понять блок и использование переменных внутри:

static <T, R> Before<T, R> create() {
    return new Before<T, R>() {
        @Override
        public Function<Function<T, R>, Function<T, R>> apply(Consumer<T> before) {
            return new Function<Function<T, R>, Function<T, R>>() {
                @Override
                public Function<T, R> apply(Function<T, R> function) {
                    return new Function<T, R>() {
                        @Override
                        public R apply(T argument) {
                            before.accept(argument);
                            return function.apply(argument);
                        }
                    };
                }
            };
        }
    };
}

что означает кратное число ->.

Лямбда-представление для каждого из этих функциональных интерфейсов объединено для представления реализации метода create.

...