Прежде всего,
квадраточие - это оператор, а не функция. Поэтому никаких аргументов он не принимает. У него есть левая часть выражения и правая часть выражения, как у оператора точка, например. Оператор точка позволяет получить значение поля, указанного в правой части выражения, класса, указанного в левой -
SomeClass.someField
Так же и квадроточие позволяет получить ссылку на метод, указанный в правой части, класса, указанного в левой.
Компилятор выводит тип ссылки из контекста и приводит её к соответствующему
функциональному интерфейсу. В частности метод
forEach принимает
Consumer<? super T>, к нему и будет приведена ссылка на метод
println
, возвращаемая выражением
System.out::println
На уровне виртуальной машины, как ссылки на методы, так и лямбды - это создаваемые в рантайме прокси-классы. Пример их генерации и композиции вы можете увидеть
здесь.