Как вынести эту логику в отдельный метод
for(MusicBand band : musicBands) {
if (band.getYear() > 2000) {
groupsAfter2000.add(band);
}
}
System.out.println(groupsAfter2000);
Ответы (2 шт):
Если вы работаете в Intellij IDEA, то вы можете выделить код, который хотите вынести в отдельный метод, далее нажать комбинацию Ctrl+Alt+M.
Либо вы можете выделить код, нажать на правую кнопку мыши, выбрать пункт Refactor, далее выбрать пункт Extract Method.
Но если вы все-таки хотите написать код сами, то метод в Java пишется следующим образом:
private void myMethod() {
// ваш код
}
В скобках перечислите параметры, которые вы хотите чтобы были у метода. А вместо void можете написать возвращаемый тип.
В самом простом случае метод будет принимать коллекцию musicBands и распечатывать отфильтрованные музыкальные группы на экран:
private void printGroupsAfter2000(Collection<MusicBand> musicBands) {
List<MusicBand> groupsAfter2000 = new ArrayList<>();
for (MusicBand band : musicBands) {
if (band.getYear() > 2000) {
groupsAfter2000.add(band);
}
}
System.out.println(groupsAfter2000);
}
Насколько я полагаю, у Вас
- необходимо отфильтровать список групп, которые были основаны после 2000-го года.
- переменную
groupsAfter2000скорее всего вы создали аккурат перед указанным куском кода и ее создание можно перенести внутрь метода - результатом работы данного метода должен являться - список отфильтрованных групп, т.е.
groupsAfter2000 - единственным параметром данного метода будет являться список групп, которые нужно отфильтровать
итого сигнатура данного метода должна выглядеть следующим образом:
public List<MusicBand> filterBandsFormedAfter2000(List<MusicBand> musicBands) {
//...
}
Итого метод будет выглядеть следующим образом:
public List<MusicBand> filterBandsFormedAfter2000(List<MusicBand> musicBands) {
List<MusicBand> groupsAfter2000 = new ArrayList<>();
for(MusicBand band : musicBands) {
if (band.getYear() > 2000) {
groupsAfter2000.add(band);
}
}
return groupsAfter2000;
}
также можно в параметры вынести год, чтобы не ограничиваться одним 2000-м:
public List<MusicBand> filterBandsFormedAfter(List<MusicBand> musicBands, int year) {
List<MusicBand> groups = new ArrayList<>();
for(MusicBand band : musicBands) {
if (band.getYear() > year) {
groups.add(band);
}
}
return groups;
}
Стоит отметить, что если эти методы появлялись в процессе жизни приложения и если они сосуществуют в приложении одновременно стоит произвести рефакторинг и избавиться от дублирующегося кода в данных методах.
В данном случае реализацию filterBandsFormedAfter2000(List<MusicBand> musicBands) можно(и нужно) свести к вызову более универсального метода filterBandsFormedAfter(List<MusicBand> musicBands, int year)
public List<MusicBand> filterBandsFormedAfter2000(List<MusicBand> musicBands) {
return filterBandsFormedAfter(musicBands, 2000);
}
И использование:
List<MusicBand> musicBandsAfter2000 = filterBandsFormedAfter2000(musicBands);
List<MusicBand> musicBandsAfter2005 = filterBandsFormedAfter(musicBands, 2005);
System.out.println(musicBandsAfter2000);
System.out.println(musicBandsAfter2005);
Streams
Также стоит помнить, что с появлением стримов в Java, такие операции как фильтрация стали гораздо лаконичнее
List<MusicBand> bandsAfter2000 = bands.stream().filter((band) -> band.getYear() > 2000 ).collect(Collectors.toList());
Что здесь происходит?
Сначала мы определяем stream на основе нашего списка
bands.stream()
Сообщаем нашему потоку, что мы хотим его отфильтровать
.filter( /*...*/ )
И передаём в него лямбду, которая будет являться условием фильтрации данного потока
(band) -> band.getYear() > 2000
В нашем случае мы принимаем на вход параметр band, являющийся музыкальной группой и пропускаем все группы, у которых верно данное выражение band.getYear() > 2000
После чего мы обратно приводим поток к списку
.collect(Collectors.toList())
И сохраняем результат фильтрации в переменную
List<MusicBand> bandsAfter2000 = //...
Последние пару пунктов, кстати необязательны, потому что при необходимости мы можем обработать элементы данного потока с помощью forEach
Например, вывести все элементы потока можно так:
.forEach(System.out::println)
Что-то более сложное, можно сделать с помощью лямбды
.forEach(band -> { band.setSomething(calculateSomething); })
PS: Спасибо @NowhereMan за дельные замечания.