Как считать элементы, используя поток - PullRequest
0 голосов
/ 25 октября 2019

Мне нужно загрузить данные файла в arraylist, что я сделал, создав метод. Как подсчитать количество учеников, использующих потоки, создав отдельный метод подсчета. У меня есть ученический класс с конструктором, геттером и сеттером.

У меня есть файл с данными как

Имя: a

Предметы: eng, phy, chem

Имя: b

Предметы: математика, био

// имя переменной в классе ученика // getName - получатель

List<Student> stu = new ArrayList<>():


public static Map<String,Long> names(List<Student> name, Predicate <Student> getName) {      
    Map<String, Long> n  = stu.stream()
    .filter(getName)    
    .collect(Collectors.groupingBy(e -> e.getName(),Collectors.counting()));
    System.out.println(Collectors.counting());
    return n;
}

Это должно просто отображать количество студентов.

1 Ответ

0 голосов
/ 25 октября 2019

Поскольку вы настаиваете на использовании потока (что, безусловно, не рекомендуется для количества элементов в списке):

public static int count(List<Student> listOfStudents) {
    long count = listOfStudents.stream().count();
    int n = Math.toIntExact(count);
    return n;
}

Поскольку Stream.count() возвращает long, либо ваш метод должен вернутьlong, который я счел бессмысленным, поскольку мы знаем, что в списке не может содержаться большее количество студентов, чем в int;или нам нужно конвертировать из long в int. Я использую Math.toIntExact для конвертации.

Комментарии верны: было бы проще и рекомендовано использовать listOfStudents.size() (и без потока).

Какой ваш метод в вопросеКазалось, что делает, считал студентов, имеющих одно и то же имя. В вашем примере результат может быть {a=1,b=1}. Но только если оба студента удовлетворяют предикату, также переданному методу.

Совет: позаботьтесь об использовании в своей программе говорящих имен, это очень много значит для читабельности. Вызовите метод, например count или getNumberOfStudents (не names). Вызовите параметр, содержащий список, например students или studentList (не name). Не называйте свой предикат тем же, что и получатель (предикат и получатель - две совершенно разные вещи). Также n для возвращаемого значения ничего не говорит и заставляет задуматься, что вы хотите, чтобы метод возвращал. Это не только ради нас (хотя радовать других стакеров - это хороший и дешевый способ получить хорошие ответы);Я думаю, что хорошие имена также помогут вам прояснить ваши мысли о программе.

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