Понимание лямбд и / или предикатов - PullRequest
0 голосов
/ 07 декабря 2018

Я полностью новичок в Java 8 и пытаюсь понять, почему последний тест неверен.

@Test
public void predicateTest() {
    Predicate<Boolean> test1 = p -> 1 == 1;
    Predicate<Boolean> test2 = p -> p == (1==1);

    System.out.println("test1 - true: "+test1.test(true));
    System.out.println("test1 - false: "+test1.test(false));
    System.out.println("test2 - true: "+test2.test(true));
    System.out.println("test2 - false: "+test2.test(false));
}

Вывод :

test1 - true: true

test1 - false: true

test2 - true: true

test2 - false: false

Ответы [ 3 ]

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

Predicate test1 = значение -> 1 == 1;

Predicate test2 = значение -> значение == (1 == 1);

Контрольный пример : System.out.println ("test2 - false:" + test2.test (false));

Вывод : false

Объяснение :

Вы вызываете метод test2 со значением "false", поэтому выполнение вашего метода будет таким:

                   false == (1==1)  => false == true => false

Таким образом, окончательный ответ будет ложным.

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

Разработка

Ваш первый Predicate т.е.

Predicate<Boolean> test1 = p -> 1 == 1;

может быть представлен как

Predicate<Boolean> test1 = new Predicate<Boolean>() {
    @Override
    public boolean test(Boolean p) {
        return true; // since 1==1 would ways be 'true'
    }
};

Таким образом, независимо от того, какое значение вы передаете выше test метод, он всегда будет возвращать только истину .

С другой стороны, второе Predicate, то есть

Predicate<Boolean> test2 = p -> p == (1==1);

может быть представлено как

Predicate<Boolean> test2 = new Predicate<Boolean>() {
    @Override
    public boolean test(Boolean p) {
        return p; // since 'p == true' would effectively be 'p'
    }
};

Так что любое значение boolean вы передадитевыше test метода, он будет возвращен как .


И затем вы можете сопоставить, как метод test соответствует каждому экземпляру test1 иtest2 анонимных классов вызываются и что должно быть вероятным выводом.

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

Это неверно, потому что p равно false, а 1==1 равно true, поэтому:

false == true оценивается как ложное.

Другими словами, когда вы вызываете эту функциюс false в качестве аргумента:

 Predicate<Boolean> test2 = p -> p == (1==1);

это можно увидеть как:

 Predicate<Boolean> test2 = p -> false == (1==1);

кстати, вышеупомянутый предикат вернет любой ввод, который вы передаете, так что по сути это:

Predicate<Boolean> test2 = p -> p;
...