Метод max (Comparator <? Super List <Integer>>) в типе Stream <List <Integer>> не применим для аргументов (Comparator <Integer>) - PullRequest
3 голосов
/ 01 июня 2019

Я пытаюсь получить имя студента на основе его максимальных оценок, используя API потоков java8.

import static java.util.Arrays.asList;
public class Main {

    public static void main(String args[]) {
        new StudentReport(asList(
                new StudentData("Rohit", asList(100, 81, 82, 83)),
                new StudentData("Ram", asList(84, 85, 86, 87))));
    }
}   

import java.util.List;
public class StudentData {

    private String name;
    private List<Integer> marks; 

    StudentData(String name, List<Integer> marks) {
        this.name = name;
        this.marks = marks;
    }    
    public String getName() {
        return name;
    }    
    public void setName(String name) {
        this.name = name;
    }    
    public List<Integer> getMarks() {
        return marks;
    }    
    public void setMarks(List<Integer> marks) {
        this.marks = marks;
    }
}

import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;

public class StudentReport {

    public StudentReport(List<StudentData> studentData)
    {
        printStudentNameWithMaxMarks(studentData);  
    }

    private void printStudentNameWithMaxMarks(List<StudentData> studentData) {
// I am getting erro here.
        studentData.stream().map(student -> student.getMarks())
        .max(Comparator.comparing(Integer::intValue)).get();
    }

}

Я хотел бы вернуть «Rohit» в выводе, потому что он набрал максимум 100 баллов.можно ли добиться в однопотоковой операции, сравнить все оценки и вернуть

new StudentData("Rohit", asList(100, 81, 82, 83)),
new StudentData("Ram", asList(84, 85, 86, 87))));

Заранее спасибо и благодарю за помощь.

Ответы [ 2 ]

3 голосов
/ 01 июня 2019

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

studentData.stream().map(student -> Collections.max(student.getMarks()))
        .max(Comparator.comparing(Integer::intValue)).get();

Проблема с приведенным выше кодом состоит в том, что он возвращает наивысшую оценку, а не учащегося, поэтому его необходимо переписать

studentData.stream().sorted((s1, s2) -> Collections.max(s1.getMarks()).compareTo(Collections.max(s2.getMarks())))
    .findFirst().get();

Приведенный выше код можно было бы легче прочитать, если StudentData может дать нам наивысшую оценку

public Integer highestMark() {
    return Collections.max(this.getMarks());
}


studentData.stream().sorted((s1, s2) -> s1.highestMark().compareTo(s2.highestMark())).findFirst().get();
3 голосов
/ 01 июня 2019

StudentData, который вы, возможно, ищете, можно получить, используя.1006 *

studentData
        .stream()
        .max(Comparator.comparingInt(a ->
                a.getMarks().stream()
                        .mapToInt(i -> i)
                        .max()
                        .orElse(0)))
        .map(StudentData::getName)
        .ifPresent(System.out::println);
...