Использование Java Predicate и Lambda - PullRequest
0 голосов
/ 05 декабря 2018

Почему приведенный ниже код возвращает Predicate<String>, а не boolean?

Насколько я понимаю, проверка !s.isEmpty() здесь идет против предиката boolean test(T t); Тип возврата здесь boolean.

Значит, в моей лямбде мой nonEmptyStringPredicate не должен быть типа boolean?Очевидно, это не так, я просто пытаюсь понять, почему это не так.

Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

Почему приведенный ниже код возвращает предикат, а не логическое значение?

Это потому, что тип функции (String s) -> !s.isEmpty() равен Predicate<String>, вВ этой точке вы просто определяете функцию (которая говорит: «если в качестве входных данных указана строка, возвращаемое значение логического значения, независимо от того, пусто оно или нет).

Обратите внимание, что в этот момент выничего не оценивая, следовательно, результатом является не логическое значение, а скорее функция .

Определение FI из документа:

Функциональные интерфейсы предоставляют целевые типы для лямбдывыражения и ссылки на методы. Каждый функциональный интерфейс имеет один абстрактный метод, называемый функциональным методом для этого функционального интерфейса, которому сопоставляются или адаптируются параметры и возвращаемые типы лямбда-выражений. Функциональные интерфейсы могут предоставлять целевой тип в нескольких контекстах, таких какконтекст присваивания, вызов метода или контекст приведения:

для получения «логического результата»вы ищете, вы должны сначала вызвать «функциональный метод».пример:

Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test(""); 
0 голосов
/ 05 декабря 2018

Lambda - это Java, это просто анонимный класс.Это:

Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();

То же самое, что и это:

Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
    public boolean test(String s) {
        return !s.isEmpty();
    }
}
0 голосов
/ 05 декабря 2018

Если вы действительно хотите получить логическое значение от Predicate, вы можете использовать метод test:

Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean val = nonEmptyStringPredicate.test("any"); // true

Predicate с другой стороны - это просто FunctionalInterface, который вы представили с помощью лямбда-выражения.

0 голосов
/ 05 декабря 2018

A Predicate получает в этом случае String в качестве параметра и возвращает boolean.В случае, если мы не пишем это как лямбда, это будет выглядеть так:

Predicate<String> somePredicate = new Predicate<String>() {
    @Override
    public boolean test(String string) {
        return !string.isEmpty();
    }
};
0 голосов
/ 05 декабря 2018

Предикат всегда возвращает логическое значение, поэтому единственное интересное значение здесь - это входной параметр, который является строкой.

См .: https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html

...