첫 번째 형태에서는 첫 번째 매개변수가 메서드의 수신자가 되고, 나머지 매개변수는 메서드에 전달한다. 예를 들어 String::compareToIgnoreCase는 (x, y) -> x.compareToIgnoreCase(y)와 같다.
두 번째 형태에서는 모든 매개변수가 정적 메서드로 전달된다. 메서드 표현식 Objects::isNull은 x -> Objects.isNull(x)와 같다.
세 번째 형태에서는 주어진 객체로 메서드를 호출하며, 매개변수는 인스턴스 메서드로 전달된다. 따라서 System.out::println은 x -> System.out.println(x)와 같다.
Note ≣
같은 이름으로 오버로드된 메서드가 여러 개일 때 컴파일러는 어느 것을 의도했는지 문맥으로 알아내려고 한다. 예를 들어 println 메서드는 여러 버전이 있다. println을 ArrayList<String>의 forEach 메서드에 전달하면 println(String) 메서드가 선택된다.
메서드 참조에서 this 매개변수를 캡처할 수 있다. 예를 들어 this::equals는 x -> this.equals(x)와 같다.
Note ≣
내부 클래스에서 EnclosingClass.this::method로 자신을 감싸는 클래스의 this 참조를 캡처할 수 있다. super도 같은 방식으로 캡처할 수 있다(4장 상속과 리플렉션 참고).