Дублируйте с помощью HashSet, используя ссылку на метод - PullRequest
5 голосов
/ 15 января 2020

Я хочу знать, есть ли в моем List<T> дубликаты элементов.

Я видел метод ниже:

public static <T> boolean areAllUnique(List<T> list){
    return list.stream().allMatch(new HashSet<>()::add);
}

Это работает, и я удивлен, почему? Поскольку кажется, что каждый раз создается новый HashSet <> (поэтому в основном метод должен всегда возвращать true, даже если дубликаты)

Если я пишу по-другому описанный выше метод, он больше не работает:

public static <T> boolean areAllUnique(List<T> list){
    return list.stream().allMatch(t -> {
        return new HashSet<>().add(t);
    });
}

Я удивлен, что 1-й метод работает, а другой - нет. Потому что для меня они выглядят одинаково

1 Ответ

5 голосов
/ 15 января 2020

new HashSet<>()::add - это ссылка на метод, ссылающаяся на указанный c экземпляр HashSet.

Это эквивалентно созданию экземпляра HashSet вне этого метода, сохраняя ссылку на него в переменная set, и вместо нее используется ссылка на метод set::add. т.е. он всегда будет работать с одним и тем же экземпляром HashSet.

Лямбда-выражение ведет себя по-разному, поскольку тело лямбда-выражения выполняется каждый раз, когда allMatch() должен применить Predicate к элементу Stream. И каждый раз, когда выполняется тело, создается новый экземпляр HashSet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...