Это из-за этой строки:
printf ("Hi %s,</br />", $name);
Вы не должны печатать / эхо ничего, прежде чем отправлять заголовки.
Вы можете использовать потоки, которые сделают это за вас.
Например:
maxLengthNickname = mentorList
.stream()
.mapToInt(mentor -> mentor.getNickname().getLength())
.max();
Однако недостатком является то, что как в вашем примере, так и в этом случае вы будете повторять один и тот же цикл несколько раз.
Возможно, имеет больше смысла сделать один цикл и сделать их все внутри.
Я бы обобщил это с помощью такого метода, как:
public <T> int max(List<T> list, ToIntFunction<T> toInt) {
int max = toInt.applyAsInt(list.get(0));
for(T t : list) {
if(toInt.applyAsInt(t) > max) {
max = toInt.applyAsInt(t);
}
}
return max;
}
И затем каждый раз, когда вам нужно вызвать его (например, с помощью String
), вы можете сделать:
List<String> list = Arrays.asList("Hello", "one", "four", "biggest");
ToIntFunction<String> length = (str) -> str.length();
int biggest = max(list, length);
[ 119] Или передайте его напрямую через ссылку на метод:
int biggest = max(list, String::length);
, который вернет 7
Или Java 8+, который вы можете сделать:
public <T> int max(List<T> list, ToIntFunction<T> toInt) {
return list.stream().mapToInt(toInt).max().orElse(Integer.MIN_VALUE);
}
, который будет удерживать вас от необходимости писать один и тот же цикл снова и снова
Документация для ToIntFunction