У нас есть список объектов доменной области (Person). У объекта Person есть 3 поля: id, имя, фамилия. Задача: найти дубликаты и создать из них список (или множество, не важно), остальные объекты отбросить. Дубликатами являются объекты, у которых совпадает поле имя. Реализовать механизм необходимо через стримы. Решение: private static Predicate distinctByKey(Function keyExtractor) {
Set
Ответ
Java для каждой лямбды и ссылки на метод в момент выполнения создаёт прокси-класс, реализующий функциональный интерфейс. Метод distinctByKey объявлен как принимающий функциональный интерфейс Function, поэтому при его вызове виртуальная машина создаст прокси-класс class Example$$Lambda$1 implements Function {
public String apply(Person person) {
return person.getName();
}
}
и передаст его вместо ссылки на метод Person::getName. Если убрать весь сахар, может стать понятнее, почему множество seen создаётся один раз. Ваш код в рантайме преобразовывается в приблизительно эквивалентный этому: class Example$$Lambda$2 implements Predicate {
private final java.util.Set arg$1; public boolean test(String name) {
return arg$1.add(name);
}
} private static Example$$Lambda$2 distinctByKey(Example$$Lambda$1 keyExtractor) {
Set
Комментариев нет:
Отправить комментарий