Ответ 1
Как работает второй пример (без лямбда)? Новый объект (Predicate and Consumer) создается каждый раз, когда я вызываю код, насколько может java-компилятор java оптимизировать выражение лямбда? Для лучшего выполнения я должен объявить все lambdas как переменную и всегда передавать только ссылку?
Задача JIT - сделать так, чтобы вам не пришлось беспокоиться об этом. Например, JIT может (и, я полагаю, сделаю это) сделать так, чтобы s -> s.length == 10
автоматически становился статической константой, поэтому он повторно использовался во всем классе, а не только в этом экземпляре. Он может даже использоваться повторно в других классах, которые используют одну и ту же лямбду в другом месте.
Вся суть lambdas заключается в том, что вы должны просто написать простейший код, который имеет смысл, и JIT имеет свободу делать все, что нужно, чтобы сделать это эффективным. Например, почему lambdas сгенерированы с использованием invokedynamic
вместо того, чтобы просто быть отстранены от анонимных внутренних классов.
Напишите простой код; доверяйте JIT, чтобы поступать правильно. Что это там для. Тем не менее, если вы хотите получить подавляющие, сложные подробные детали, это, это почти наверняка лучший источник.