Я преобразовывал некоторый код для использования функций Java 8. В следующем надуманном примере
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 в целое число или объект.
Кажется, что реальная проблема заключается в том, что предполагаемый возвращаемый тип первой лямбды — 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))
);
он работает отлично, но не так элегантно. Есть ли лучший способ «направить» компилятор к типу возвращаемого значения, который я хочу?
Optional.<Integer>empty()
? - person JB Nizet   schedule 15.10.2014