Я изо всех сил пытаюсь создать метод, который при вводе определенного месяца (с 1 до 12) отображал все Члены, которые присоединились к классу Общество в этом месяце. Например,
Я ввожу: 3 (что означает "март")
Выход: 15 (что указывает на 15 участников, которые присоединились в том же месяце)
Пока у меня есть только метод вывода на печать, который выдает сообщение об ошибке, если вы вводите что-либо ниже 1 или выше 12 в моем методе (присоединилсяInMonth), был бы очень признателен за совет или помощь.
Класс общества:
public class Society
{
private ArrayList<Member> myMembers;
private Member member;
private String societyName;
public Society(String society)
{
myMembers = new ArrayList<Member>();
this.societyName = society;
}
public String getSocietyName()
{
return societyName;
}
public void join(Member member)
{
myMembers.add(member);
}
public void showMember(int listPosition)
{
Member member;
if ( listPosition < myMembers.size() )
{
member = myMembers.get(listPosition);
System.out.println("Position " + listPosition + ": " + member);
}
}
public void joinedInMonth(int joined) {
if (joined > 12 || joined < 1) {
System.out.println("Invalid number");
}
}
public int numberOfMembers()
{
return myMembers.size();
}
public void printDetails()
{
for (Member m : myMembers) {
System.out.println("Society Name: " + societyName);
System.out.println(m.toString());
System.out.println("--------------------------");
}
}
Класс участника:
public class Member
{
private int month;
private int year;
private String name;
private Society society;
public Member(String name, int month, int year)
{
this.name = name;
this.month = month;
this.year = year;
}
public int getYear()
{
return year;
}
public int getMonth()
{
return month;
}
public String getName()
{
return name;
}
public String toString()
{
return "Name: " + name + ", Month Joined: " + month + ", Year Joined:" + year;
}
}




Вы можете просмотреть участников и проверить месяц, в котором каждый из них присоединился:
public void joinedInMonth(int joinedMonth) {
if (joinedMonth > 12 || joinedMonth < 1) {
System.out.println("Invalid number");
}
long numJoined = members.stream().filter(m -> m.getMonth() == joinedMonth).count();
System.out.printf("%d members joined on month %d%n", numJoined, joinedMonth);
}
@MichaelWitherspoon Не уверен, что понимаю вопрос. Хотите уточнить?
1) stream () был вызван в вашем списке, который преобразует его в поток stream, в котором вы можете выполнять свои промежуточные операции. 2) filter () работает с потоками, на самом деле filter принимает предикат, который дает true / false в зависимости от того, выполняет ли он условие или нет в вашем случае те объекты в списке, в которых значение месяца фактически равно объединенному месяцу, поэтому он буду собирать только их и игонре другие. 3) count (): этот метод будет собирать количество всех объектов в вашем списке, которые передают условие предиката и фактически равны объему соединенного месяца.
Вы ответили на мой вопрос, я просто хотел быстро разобрать код, поэтому я примерно знаю, как он работает, большое спасибо за помощь. :)
Приведенный выше комментарий @MichaelWitherspoon Gurinder S Panesar довольно хорошо разбирает код (спасибо, BTW!). Вы также можете прочитать Руководства Oracle, чтобы лучше понять
Большое спасибо, код сработал, однако, поскольку я хотел бы понять код вместо того, чтобы быть удовлетворенным, как работает «длинный», а также поток и фильтр?