x -> x * x;
x -> System.out.println(x * x);
Coś takiego prawa bytu nie ma, najpierw tworzysz expression dla czegoś czegoś co wzraca Ci kwadrat tego, a nastepnie czegoś co zwraca Ci wynik kwadratu, przez komilator traktowane by to było jakby "2 inne lambda expression" co innego przyjmujesz co innego zwracasz ba, w pierwszym mogłby być to Supplier a w drugim Consumer tylko ... bo nic nie zwracasz a wykonujesz operacje na przekazanym argumencie.
Maszyna nie wie czym X jest, może to być cokolwiek, program nie utożsamia Ci x- z zmienną x którą napisałeś
public class LambdaTest
{
public static void main(String[] args)
{
int x=11;
Function<Integer,Integer> function = y-> y*y;
System.out.println( function.apply(x));
}
}