我遇到了以下問題:
如果我將流中的物件映射到 Java 中的特定類,則 Java 流 API 在映射后無法識別特定物件,并且仍然假定它是物件。我做錯了什么,有沒有辦法在沒有潛在的類轉換例外的情況下解決這個問題?
這是代碼示例:
public class MyMapper {
MyMapper() {
Object someObject = new Person();
final var listOfObjects = List.of(someObject);
final var listOfPerson = toListOfPerson(listOfObjects);
}
List<Optional<Person>> toListOfPerson(Object object) {
return ((List) object).stream()
.map(this::toPerson)
.collect(Collectors.toList());
}
Optional<Person> toPerson(Object object) {
if (object instanceof Person) {
return Optional.of((Person) object);
}
return Optional.empty();
}
public class Person {}
}
uj5u.com熱心網友回復:
將其轉換為型別化串列,然后您的.map(this::toPerson)將“接受”此串列的元素
List<Optional<Person>> toListOfPerson(Object object) {
return ((List<Object>) object).stream()
.map(this::toPerson)
.collect(Collectors.toList());
}
uj5u.com熱心網友回復:
保留可能為空的可選物件的集合是沒有意義的,它幾乎與存盤null
值相同。
如果您出于某種原因認為這List<Optional<Person>>
是個好主意,我建議您看看這個問題。Stuart Marks(JDK 開發人員)的回答引述:
我敢肯定,有人可能會想出一些人為的情況,他們真的想將 Optional 存盤在 field 或collection中,但總的來說,最好避免這樣做。
JDK 中引入了 Optional 作為一種有限的機制來表示可為空的回傳值。這是它的唯一目的,其他使用可選物件的情況,如可選方法引數、欄位、可選集合,被認為是反模式。
您必須Optional
在流中解壓縮您的 s:
public List<Person> toListOfPerson(Object object) {
if (!(object instanceof List<?>)) {
return Collections.emptyList();
}
return ((List<?>) object).stream()
.map(this::toPerson)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/466393.html