Java - Как фильтровать по значению (Список) - PullRequest
0 голосов
/ 03 июня 2018

Я постараюсь объяснить как можно лучше.Давайте представим, что у меня есть этот класс:

public class Student {
    public String nome;
    public int number;
    public int age;
    public int grade;
}

Теперь у меня будет карта, определенная как:

Map<String, Student> students;

Я захочу найти учеников с оценкой> = 10, и я сделалчто-то вроде этого:

public List<Student> grade() {
  return students.values()
                 .stream()
                 .filter(Student::verifyGrade)
                 .map(Student::clone)
                 .collect(Collectors.toList());
}

Вот первая проблема:
- Я получаю сообщение об ошибке «несовместимые типы: не могу определить переменные типа (типов) R» для .map (Student :: clone)).

2-я проблема: Теперь, если моя карта определила что-то вроде: (это просто пример, о котором я думал), как бы я фильтровал с тем же стилем на 1-м? *

Map<String, List<Student> >

Спасибо за внимание :)

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

если все, что вы хотите сделать, это filter , тогда вам не нужно .map(Student::clone), но если вам нужно клонировать объекты, читайте дальше.

Object::clone возвращаетвведите Object, следовательно, ошибка компиляции, есть обходной путь, приводящий возвращенный Object к типу Person, но вместо этого я просто создал бы конструктор копирования или метод, который копирует содержимое Student в новыйэкземпляр и возвращает его.

Затем просто сделайте:

.map(Student::new) // assuming you have a constructor public Student(Student s){...}

или

.map(Student::copy) // assuming you have a method public static Student copy(Student s){...}

, чтобы ответить на ваш второй вопрос:

List<Student> resultSet = 
           myMap.values()
                .stream()
                .flatMap(Collection::stream)
                .filter(Student::verifyGrade)
                .map(Student::new)
                .collect(Collectors.toList());

, если вам не нужнодля клонирования объектов Student, а затем просто удалите вызов
.map(Student::new).

0 голосов
/ 03 июня 2018

Первая проблема, которую вам не нужно использовать map(Student::clone) после filter:

return students.values()
        .stream()
        .filter(Student::verifyGrade)
        .collect(Collectors.toList());

Вторая проблема, если карта похожа на Map<String, List<Student>> вы можете использовать flatMap, например, так:

return students.values()
        .stream()
        .flatMap(List::stream)
        .filter(Student::verifyGrade)
        .collect(Collectors.toList());
...