Как вынести эту логику в отдельный метод

for(MusicBand band : musicBands) {
            if (band.getYear() > 2000) {
                groupsAfter2000.add(band);
            }
        }
        
        System.out.println(groupsAfter2000); 

Ответы (2 шт):

Автор решения: Vadik

Если вы работаете в 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 за дельные замечания.

→ Ссылка