Ответ 1
Справочник метода System.out::println
сначала оценит System.out
, затем создаст эквивалент лямбда-выражения, который фиксирует оцениваемое значение. Обычно вы используете o->System.out.println(o)
для достижения того же, что и ссылка на метод, но это lambda-выражение будет оценивать System.out
каждый раз, когда будет вызван метод.
Таким образом, точным эквивалентом будет:
PrintStream p = Objects.requireNonNull(System.out);
numbers.forEach(o -> p.println(o));
что будет иметь значение, если кто-то вызывает System.setOut(…);
промежуточный.