Можно ли адаптировать блок кода под Java stream API?

124
23 декабря 2020, 05:00

Стоит задача собрать в мапу студентов с самой большой оценкой из каждого класса. Класс студент

public class Student{
    private String group;
    private int mark;
    public Student(String group, int mark){
        this.group= group;
        this.mark= mark;
    }
// геттеры и сеттеры

Класс Main

    Student student1 = new Student("a", 1);
    Student student2 = new Student("a", 2);
    Student student3 = new Student("b", 1);
    Student student4 = new Student("b", 2);
    Student student5 = new Student("c", 1);
    Student student6 = new Student("c", 2);
    List<Student> studentList = new ArrayList<>();
    studentList.add(student1);
    studentList.add(student2);
    studentList.add(student3);
    studentList.add(student4);
    studentList.add(student5);
    studentList.add(student6);

Главный вопрос: можно ли как-то адаптировать следующий код под stream API(хотя бы частично)?:

Set<Student> completed = new HashSet<>();
    for (int i = 0; i < studentList.size(); ++i) {
        List<Student> sameGroup= new ArrayList<>();
        for (int j = 0; j < studentList.size(); ++j) {
            if (studentList.get(i).getGroup().equals(studentList.get(j).getGroup())) {
                sameGroup.add(studentList.get(j));
            }
        }
        completed.add(Collections.max(sameGroup, Comparator.comparingInt(Student::getMark)));
    }
    Map<String, Student> map = new HashMap<>();
    Iterator iterator = completed.iterator();
    while (iterator.hasNext()){
        Student student= (Student) iterator.next();
        map.put(student.getGroup(), student);
    }

Я пытался засунуть его в stream().map(), но в том или ином случае получал ошибку компиляции. Буду очень благодарен за любой совет/помощь.

Answer 1

Например, как-то так

Map<String, Student> map = studentList.stream()
                .collect(Collectors.toMap(
                        Student::getGroup, 
                        o -> o, 
                        (o, o2) -> o.getMark() > o2.getMark() ? o : o2
                ));
READ ALSO
Сохранение даты в MySQL

Сохранение даты в MySQL

Я обычно использую VARCHAR(255) и в java пишу preparedStatementsetString(

120
Как создать многострочный tooltip в SVG

Как создать многострочный tooltip в SVG

В SVG тултип реализуется с помощью парного тега <title> Текст подсказки </title>

120
Аналог редактирования prototype в JS на Python 3

Аналог редактирования prototype в JS на Python 3

В js, если мне вдруг нужно будет, я смогу добавить новый метод для любого объектаНапример метод exist для массива:

124