如何使用 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 值 的有限机制。这是它的唯一目的,其他使用可选对象的情况,如可选方法参数、字段、可选集合被认为是反模式。

您必须在流中解压缩您的 Optionals:

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());
}