В чем преимущество использования ссылок на методы в этом случае?

У меня есть две переменные следующим образом:

List<Basket> bigBasket = new ArrayList<>(); Basket basket = new Basket();

Я написал следующий код, чтобы добавить связь между элементами в bigBasket и basket:

for (Fruit specialFruit : bigBasket.get(0).getFruitInBasket()) {
    for (Fruit fruit : basket.getFruitInBasket()) {
        specialFruit.addRelationship(fruit);
    }
}

Теперь все в порядке, но IntelliJ проверил код и предложил улучшить его с помощью ссылки на метод, поэтому я получил следующее:

for (Fruit specialFruit : bigBasket.get(0).getFruitInBasket()) {
   basket.getFruitInBasket().forEach(specialFruit::addRelationship);
}

Итак, в приведенном выше меньше строк, но в чем его фактическое преимущество? Я не совсем разбираюсь в преимуществах функций Java 8, поэтому, вероятно, я не совсем понимаю, что происходит.

На мой взгляд, «улучшенная» версия кода не очень удобочитаема в смысле немедленного понимания того, что происходит по сравнению со стандартным циклом for, если у вас мало знаний о функциях Java 8.

Может ли кто-нибудь объяснить преимущества «улучшенного» кода по сравнению со стандартным циклом for?

РЕДАКТИРОВАТЬ: удалены неправильные ссылки на лямбда-выражения. В коде используются только ссылки на методы — просто моя языковая ошибка!


person user2844485    schedule 19.02.2015    source источник
comment
Может быть, это просто ссылка на метод, которая кажется вам неинтуитивной? Как насчет bigBasket.get(0).getFruitInBasket().forEach(specialFruit -> basket.getFruitInBasket().forEach(fruit -> specialFruit.addRelationship(fruit) )); ?   -  person Holger    schedule 19.02.2015
comment
Конечно, идиома не может быть понятна человеку, не знакомому с ней, но это всего лишь трюизм. Действительно важный момент заключается в следующем: какой из них более удобочитаем для человека, одинаково знакомого с обеими идиомами? Для меня конструкция forEach намного проще, потому что меньше вещей нужно проверять, чтобы быть уверенным в том, что делает фрагмент.   -  person Marko Topolnik    schedule 19.02.2015


Ответы (1)


Я не вижу преимущества в "улучшенном" коде с точки зрения производительности. Оба фрагмента будут перебирать всю коллекцию basket.getFruitInBasket() и выполнять одно и то же действие для каждого элемента.

Предпочтение того или иного способа — дело вкуса. На мой взгляд, версия Java 8 более четко выражает тот факт, что вы выполняете одно действие над всеми элементами коллекции (при условии, что вы привыкли к ссылкам на методы).

Кстати, в вашем коде нет лямбда-выражения, только ссылка на метод.

person Eran    schedule 19.02.2015