是否可以在 Java 8 中转换 Stream?

新手上路,请多包涵

是否可以在 Java 8 中投射流?假设我有一个对象列表,我可以做这样的事情来过滤掉所有额外的对象:

 Stream.of(objects).filter(c -> c instanceof Client)

不过,在此之后,如果我想对客户做些什么,我需要对他们中的每一个进行投射:

 Stream.of(objects).filter(c -> c instanceof Client)
    .map(c -> ((Client) c).getID()).forEach(System.out::println);

这看起来有点难看。是否可以将整个流转换为不同的类型?喜欢将 Stream<Object> 转换为 Stream<Client> 吗?

请忽略这样一个事实,即做这样的事情可能意味着糟糕的设计。我们在我的计算机科学课上做过这样的事情,所以我正在研究 Java 8 的新特性,并且很好奇这是否可行。

原文由 Phiction 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 401
2 个回答

我不认为有一种开箱即用的方法。一个可能更清洁的解决方案是:

 Stream.of(objects)
    .filter(c -> c instanceof Client)
    .map(c -> (Client) c)
    .map(Client::getID)
    .forEach(System.out::println);

或者,如评论中所建议的,您可以使用 cast 方法 - 前者可能更容易阅读:

 Stream.of(objects)
    .filter(Client.class::isInstance)
    .map(Client.class::cast)
    .map(Client::getID)
    .forEach(System.out::println);

原文由 assylias 发布,翻译遵循 CC BY-SA 3.0 许可协议

按照 ggovan 的回答,我这样做如下:

 /**
 * Provides various high-order functions.
 */
public final class F {
    /**
     * When the returned {@code Function} is passed as an argument to
     * {@link Stream#flatMap}, the result is a stream of instances of
     * {@code cls}.
     */
    public static <E> Function<Object, Stream<E>> instancesOf(Class<E> cls) {
        return o -> cls.isInstance(o)
                ? Stream.of(cls.cast(o))
                : Stream.empty();
    }
}

使用这个辅助函数:

 Stream.of(objects).flatMap(F.instancesOf(Client.class))
        .map(Client::getId)
        .forEach(System.out::println);

原文由 Brandon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题