如何使用 Stream API 将对象类型的实例映射到 Java 中的特定 Class
How to map an instance of type Object to specific Class in Java using Stream API
我遇到了以下问题:
如果我将流中的对象映射到 Java 中的特定 class,java 流 API 在映射后无法识别特定对象,并且仍然假设它是一个对象。我做错了什么,有没有办法在没有潜在 class 转换异常的情况下解决这个问题?
代码示例如下:
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 {}
}
将其转换为类型列表,然后您的 .map(this::toPerson) 将“接受”此列表的元素
List<Optional<Person>> toListOfPerson(Object object) {
return ((List<Object>) object).stream()
.map(this::toPerson)
.collect(Collectors.toList());
}
保留 可选对象 的集合没有意义,它可能是空的,它几乎与存储 null
值相同。
如果您出于某种原因认为 List<Optional<Person>>
是个好主意,我建议您看看 this question。引用 Stuart Marks(JDK 开发人员)的回答:
I'm sure somebody could come up with some contrived cases where they
really want to store an Optional in a field or a collection, but in
general, it is best to avoid doing this.
Optional 是在 JDK 中引入的,作为表示 可空 return 值 的有限机制。这是它的唯一目的,其他使用可选对象的情况,如可选方法参数、字段、可选集合被认为是反模式。
您必须在流中解压缩您的 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());
}
我遇到了以下问题:
如果我将流中的对象映射到 Java 中的特定 class,java 流 API 在映射后无法识别特定对象,并且仍然假设它是一个对象。我做错了什么,有没有办法在没有潜在 class 转换异常的情况下解决这个问题?
代码示例如下:
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 {}
}
将其转换为类型列表,然后您的 .map(this::toPerson) 将“接受”此列表的元素
List<Optional<Person>> toListOfPerson(Object object) {
return ((List<Object>) object).stream()
.map(this::toPerson)
.collect(Collectors.toList());
}
保留 可选对象 的集合没有意义,它可能是空的,它几乎与存储 null
值相同。
如果您出于某种原因认为 List<Optional<Person>>
是个好主意,我建议您看看 this question。引用 Stuart Marks(JDK 开发人员)的回答:
I'm sure somebody could come up with some contrived cases where they really want to store an Optional in a field or a collection, but in general, it is best to avoid doing this.
Optional 是在 JDK 中引入的,作为表示 可空 return 值 的有限机制。这是它的唯一目的,其他使用可选对象的情况,如可选方法参数、字段、可选集合被认为是反模式。
您必须在流中解压缩您的 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());
}