2016-03-14 4 views
0

У меня возникли проблемы с Java в написании Lambda Consumer, если утверждение корректно. Потребитель должен работать так, чтобы, если объект Teos имеет значение null или метод getNimi возвращает «", он меняет имя с помощью setNimi на «nimi ei tiedossa». Это домашнее задание, поэтому я должен написать Lambda в качестве параметра, а не в самом методе.Lambda Consumer if-statement

kokoelma.muuta(teos -> { 
     if (teos.getNimi().equals("") || teos.getNimi() != null) {  
      teos.setNimi("nimi ei tiedossa") 
     } 
    }; 
); 

Как должно быть написано заявление if?

Сообщение об ошибке NetBeans; ожидаемый, ожидаемый и незаконный старт выражения, но я не могу найти правильные точки; а также).

Заранее спасибо.

+0

Что вы подразумеваете под «Я должен написать Лямбду в качестве параметра, а не в самом методе»? Вы имеете в виду, что вам нужно создать свою лямбду отдельно, как экземпляр «Потребителя», а затем написать что-то вроде 'kokoelma.muuta (myLambda);'? –

ответ

0

Если у вас есть более сложный lambda, вы должны разбить его на несколько строк.
Если вы сделаете это, то станет ясно, где вы сделали неправильно:

kokoelma.muuta(teos -> { 
    if (teos.getNimi().equals("") || teos.getNimi() != null) 
     teos.setNimi("nimi ei tiedossa") 
    }; 
); 

Более короткая версия лямбда, которая может содержать только одно заявление, не имеет полу-колонов и распоряжается { и }:

kokoelma.muuta(teos -> if (teos.getNimi().equals("") || teos.getNimi() != null) teos.setNimi("nimi ei tiedossa")); 
+0

Отличные мысли думают одинаково .. – Claudiu

+0

Спасибо вам обоим. – kerubi

2

Попробуйте расширить его.

kokoelma.muuta(teos -> {if (teos.getNimi().equals("") || teos.getNimi() != null) teos.setNimi("nimi ei tiedossa")};); 

Это становится:

kokoelma.muuta(teos -> { 
    if (teos.getNimi().equals("") || teos.getNimi() != null) 
     teos.setNimi("nimi ei tiedossa") 
}; 
); 

Отсюда ясно, как точка с запятой должна быть после того, как заявление, и не должно быть один после лямбда:

kokoelma.muuta(teos -> { 
    if (teos.getNimi().equals("") || teos.getNimi() != null) 
     teos.setNimi("nimi ei tiedossa"); 
} 
); 

Или, укороченный еще раз:

kokoelma.muuta(teos -> { if (teos.getNimi().equals("") || teos.getNimi() != null) teos.setNimi("nimi ei tiedossa");}); 
+0

Отличный ответ! Я бы предпочел придерживаться не укороченной ламбы для этого. – dinomario10

+0

Большое спасибо за быстрый ответ, я попытался сломать его, но не заметил ошибку. Теперь он работает по назначению. – kerubi

0

Его больше понимания о том, как потребители работают в java8.
Его любая функция, которая берет тип и выполняет некоторую операцию, не возвращая ничего.
Извините, я не знаю, что такое muuta, но это похоже на некоторую итерацию по итерируемой кокоэльме.

Для этого вы можете получить эксклюзивный потребитель и передать его в muuta.

, например

public static class Something{ 
    String nimi; 

    public String getNimi() { 
     return nimi; 
    } 

    public void setNimi(String nimi) { 
     this.nimi = nimi; 
    } 
} 

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

List<Something> kokoelma = new ArrayList<>(); 

    Consumer<Something> checkAndSet = 
      teos -> { 
       if (teos.getNimi().equals("") || teos.getNimi() != null) 
        teos.setNimi("nimi ei tiedossa"); 
      }; 

    kokoelma.forEach(checkAndSet);