Вы получаете Optional<Integer>
, потому что это тип возврата reduce(...)
.Он возвращает Optional
, потому что нет никакого уменьшенного значения из пустого списка.
Конечно, в вашем случае пустой список не может произойти, потому что еслиnumbers
пусто, numbers.split(" ")
вернет массив из одной пустой строки, а Integer.parseInt(s)
выдаст NumberFormatException: For input string: ""
.
Добавьте filter(...)
, чтобы игнорировать это пустое значение.Вам нужно решить, что вы хотите, чтобы ваш метод возвращал, если вход пустой, например, пустая строка.
Теперь, когда вы знаете, что список не пуст, вы можете просто развернуть Optional
, вызвав get()
.
Вместо вызова reduce(...)
следует использовать max(...)
и min(...)
:
public static String highAndLow(String numbers) {
List<Integer> nums = Arrays.asList(numbers.split(" ")).stream()
.filter(s -> ! s.isEmpty())
.map(Integer::valueOf)
.collect(Collectors.toList());
if (nums.isEmpty())
return "";
int max = nums.stream().max(Comparator.naturalOrder()).get();
int min = nums.stream().min(Comparator.naturalOrder()).get();
return max + " " + min;
}
Еще лучше, не объединяйте все числа в Integer
объекты.Вместо Stream<Integer>
вы должны использовать IntStream
:
public static String highAndLow(String numbers) {
int[] nums = Arrays.asList(numbers.split(" ")).stream()
.filter(s -> ! s.isEmpty())
.mapToInt(Integer::parseInt)
.toArray();
if (nums.length == 0)
return "";
int max = IntStream.of(nums).max().getAsInt();
int min = Arrays.stream(nums).min().getAsInt(); // Arrays.stream is alternate to IntStream.of
return max + " " + min;
}