it-swarm.com.ru

Использование Java Predicate и Lambda

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

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

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

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

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

Predicate<String> somePredicate = new Predicate<String>() {
    @Override
    public boolean test(String string) {
        return !string.isEmpty();
    }
};
6
CodeMatrix

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

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

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

3
nullpointer

Лямбда это Java это просто анонимный класс. Это:

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

Это так же, как это:

Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
    public boolean test(String s) {
        return !s.isEmpty();
    }
}
1
M314

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

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

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

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

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

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

Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test(""); 
1
Aomine

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

Смотрите: https://docs.Oracle.com/javase/8/docs/api/Java/util/function/Predicate.html

0
comrad