Я преобразовал некоторый код, чтобы использовать функции Java 8. В следующем примере надуманногоТип вывода на lambdas
Arrays.asList("1", "2", "3", "cheese", "5").stream().map(line -> {
try {
return Optional.of(Integer.parseInt(line));
} catch (NumberFormatException xep) {
return Optional.empty();
}
}).forEach(v ->
System.out.println(v.orElse(999))
);
(намерение, чтобы разобрать некоторые строки как Интс и замените значения с не поддается синтаксическим анализ 999)
Компилятор отчеты
error: incompatible types: int cannot be converted to CAP#1
System.out.println(v.orElse(999))
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ? extends Object"
Я пробовал литье 999 к Integer или Object без успеха.
Кажется, что реальная проблема заключается в том, что выведенный тип возврата первого лямбда является Optional<Object>
и не Optional<Integer>
Если я это
Arrays.asList("1", "2", "3", "cheese", "5").stream().map(line -> {
Optional<Integer> ans;
try {
ans = Optional.of(Integer.parseInt(line));
} catch (NumberFormatException xep) {
ans = Optional.empty();
}
return ans;
}).forEach(v ->
System.out.println(v.orElse(999))
);
он прекрасно работает, но не совсем так элегантно. Есть ли лучший способ «направить» компилятор на возвращаемый тип, который я хочу?
вы пытались использовать 'Дополнительно пустой()' –