Передача функционального интерфейса в качестве параметра - PullRequest
2 голосов
/ 29 апреля 2019

Я довольно новичок в работе с функциональным интерфейсом и не знаю, как это сделать, передавая его в качестве параметра.Я надеюсь, что вы могли бы помочь мне с этим.Итак, у меня есть этот класс с именем NumberValidation:

public class NumberValidation {

    public static Predicate<CommonNumber> isExisting(Function<CommonNumber, CommonNumber> retrieve){
        return (p ->{
            return Optional.ofNullable(retrieve.apply(p)).isPresent();
        });
    }

    public static Predicate<CommonNumber> isNotExisting(Function<CommonNumber, CommonNumber> retrieve){
        return (p ->{
            return !Optional.ofNullable(retrieve.apply(p)).isPresent();
        });
    }
}

Как видите, у меня есть две функции, а именно isExisting и isNotExisting с параметром Function<CommomNumber, CommonNumber>.Скажем, я хочу использовать одну из этих функций, например:

public CommonNumber apply(CommonNumber t) {
    return Optional.of(t).filter(p -> {
        return NumberValidation.isExisting(//parameter here);
    });
}

Я понятия не имею, как я собираюсь передать этот параметр.Я пробовал return NumberValidation.isExisting(t) и return NumberValidation.isExisting(p), но получаю сообщение об ошибке, так как обязательный параметр Function<CommonNumber,CommonNumber>

1 Ответ

3 голосов
/ 29 апреля 2019

Я не уверен, что вы пытаетесь сделать здесь. Я вижу три проблемы с вашим кодом, первая из которых, возможно, отвечает на ваш вопрос:

1) Вам нужно передать Function<CommonNumber, CommonNumber> в numberValidating.isExisting(). То есть функция, которая принимает CommonNumber и возвращает CommonNumber. Я не знаю, откуда это должно прийти. Похоже, это проблема, о которой вы спрашиваете, но если у вас был один из них или вы построили один с лямбдой, у вас не должно возникнуть проблем с передачей того, где у вас есть //parameter here.

2) Вы передаете лямбду, которая возвращает Predicate в ваш метод filter(), но filter() занимает Predicate. Так что я думаю, что вам не нужна дополнительная лямбда. Я думаю, что вы хотите напрямую передать результат вызова NumberValidation.isExisting().

3) Ваш звонок на filter() вернет Optional<CommonNumber>, но вы пытаетесь вернуть его как CommonNumber. Так что вам нужно вытащить CommonNumber из Optional и вернуть его.

Применяя эти три идеи к вашему коду, вот что-то, что компилируется. Я полагаю, что вы, вероятно, хотите передать более интересную функцию, чем p -> p. Кроме того, я не знаю, хотите ли вы проверить Optional и передать что-то другое, если оно не содержит CommonNumber. В любом случае, это должно помочь вам начать:

public CommonNumber apply(CommonNumber t) {
    return Optional.of(t).filter(NumberValidation.isExisting(p -> p)).get();
}

Ваш NumberValidation класс выглядит нормально, как есть.

В случае, если p -> p не полностью отвечает на вопрос, как передать Function<CommonNumber, CommonNumber> в ваш метод, вот еще один пример, который более явно создает такую ​​функцию:

static CommonNumber someCommonNumberProcessor(CommonNumber cn) {
    return cn;
}

public CommonNumber apply(CommonNumber t) {
    return Optional.of(t).filter(NumberValidation.isExisting(Test2::someCommonNumberProcessor)).get();
}

Это все внутри класса с именем Test2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...