Если вы ищете наиболее эффективный способ сделать это, придерживайтесь того способа, которым вы сейчас занимаетесь. Ваше решение многословно, но, вероятно, настолько эффективно, насколько это возможно. И нет никаких сомнений в том, что ваш код легче понять, чем другие альтернативы.
Если вы ищете решения, которые используют меньше строк кода, вы можете реализовать это с помощью потоков и фильтров или путем создания массива или списка ссылок Product
и итерации. Однако все эти решения влекут за собой создание временных структур данных и существенно менее эффективны.
Обратите внимание, что если вызов getSuperProduct(p)
встроен JIT-компилятором, то он может оптимизировать тест импликации для null
, который происходит в вызове.
Кроме того, я хотел бы, чтобы проверка на нулевое значение каждый раз обходилась дороже, чем добавление в список и итерация по нему?
Я думаю, что вы найдете обратное дело. Вам нужно будет выполнить нулевые проверки в любом случае (или нет ... см. Выше). Когда вы пытаетесь использовать список, массив или поток, у вас возникают накладные расходы на создание структуры данных (один или несколько новых объектов кучи для создания и инициализации), и у вас возникают накладные расходы на тестирование, когда вы дойдете до конца списка /array/stream.
И последнее, на что нужно обратить внимание: эффективность кода, подобного этому, часто не имеет значения. Мы, вероятно, говорим о разнице менее чем в 100 инструкциях; то есть разница менее 1 мкс. Это, вероятно, тривиально по сравнению с остальной частью того, что делает приложение.