Недавно я провел техническое собеседование и получил небольшую задачу по написанию кода в Stream API.Давайте рассмотрим следующий ввод:
public class Student {
private String name;
private List<String> subjects;
//getters and setters
}
Student stud1 = new Student("John", Arrays.asList("Math", "Chemistry"));
Student stud2 = new Student("Peter", Arrays.asList("Math", "History"));
Student stud3 = new Student("Antony", Arrays.asList("Music", "History", "English"));
Stream<Student> studentStream = Stream.of(stud1, stud2, stud3);
Задача состоит в том, чтобы найти студентов с уникальными предметами, используя Stream API .Таким образом, для предоставленного ввода ожидаемый результат (порядок игнорирования) равен [John, Anthony]
.
. Я представил решение, используя собственный коллектор:
Collector<Student, Map<String, Set<String>>, List<String>> studentsCollector = Collector.of(
HashMap::new,
(container, student) -> student.getSubjects().forEach(
subject -> container
.computeIfAbsent(subject, s -> new HashSet<>())
.add(student.getName())),
(c1, c2) -> c1,
container -> container.entrySet().stream()
.filter(e -> e.getValue().size() == 1)
.map(e -> e.getValue().iterator().next())
.distinct()
.collect(Collectors.toList())
);
List<String> studentNames = studentStream.collect(studentsCollector);
Но решение было сочтено не оптимальным / эффективным.Не могли бы вы поделиться своими идеями относительно более эффективного решения этой задачи?
ОБНОВЛЕНИЕ: Я получил другое мнение от одного парня, что он будет использовать редуктор (метод Stream.reduce ()).Но я не могу понять, как это может повысить эффективность.Что ты думаешь?