Правильно ли я понимаю что "::" - это просто способ не писать тело метода, а просто передать ссылку на метод с идентичной сигнатурой и функционал которого нам подходит? И
salariesMap.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .forEach( s->System.out.println(s));
это тоже самое что и
salariesMap.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .forEach(System.out::println);
Ну-то бишь, компилятор видит необходимость реализовать функциональный интерфейс, но вместо тела единственного метода - я передаю ему ссылку на уже реализованный метод и если сигнатура совпадает - он просто принимает тело метода на который я ссылаюсь как тело метода реализующего интерфейс? В моем случае
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
компилятор примет ссылку на любой метод, который принимает один параметр и ничего не возвращает.