OCPJP 8 II Потребитель против Поставщика IZ0-809 - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь получить сертификат IZO-809, я читал тестовую книгу OCA / OCP SE8, и код действительно привлек мое внимание.

Код заставляет меня ответить на этот вопрос.

Я знаю, что потребитель получает параметр и ничего не возвращает, а поставщик не имеет параметров и возвращает значение.

Но этот код почти такой же после ->.

public class Pregunta24{
   private final Object obj;
   public Pregunta24(final Object obj){
      this.obj = obj;
   }    
}
//Returns a Supplier
private final Supplier<Pregunta24>supplier = ()->new Pregunta24("HI");
//Returns a Consumer.
private final Consumer<Pregunta24>consumer = a->new Pregunta24(a);

Оба кода работают.

Но если этот код не работает, я знаю, что потребитель не возвращает ничего.

private final Consumer<String>consumerString = String::length

Я знаю, что это не работает, потому что потребитель не возвращает значение, мой вопрос в коде поставщика ипотребительский код, код находится сразу после знака ->, но на этот раз считается возвращаемым фактически экземпляром класса.

Мой вопрос: почему иногда Java жалуется, что это возвращаемое значение, а что-то нет?

Я имею в виду этот код.

private final Supplier<Pregunta24>supplier = ()->new Pregunta24("HI");
// I would think is returning a instance of the Pregunta24 class.
private final Consumer<Pregunts24>consumer = a->new Pregunta24(a);

Возвращает то же самое после ->, но почему в потребителе не говорят об ошибке.

incompatible types: bad return type in lambda expression

Но если я делаю это, я делаю

final Consumer<String>consumerString = a->1;

I-йвведите код после -> выводится контекст

Извините, если вопрос прост.

С наилучшими пожеланиями из Венесуэлы.

1 Ответ

0 голосов
/ 01 июня 2018

Согласно javadoc Consumer :

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

Consumer<Pregunts24>consumer = a->new Pregunta24(a);

на самом деле ничего не вернуть.Это в основном реализация метода Consumer#accept, который принимает объект типа T и имеет void в качестве возвращаемого типа.

public void accept(Pregunta24 a) {
    new Pregunta24(a);
}

Вы ничего не возвращаете.То же самое с

Consumer<String>consumerString = String::length
public void accept(String a) {
    a.length();
}

Однако

Consumer<String>consumerString = a->1;

является недопустимым выражением, которое переводится примерно так:

 public void accept(String a) {
        1;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...