1. ホーム
  2. java

[解決済み] Java 8でStreamをキャストすることは可能ですか?

2022-04-13 10:43:22

質問

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の新機能を調べていて、これが可能かどうか知りたくなりました。

どのように解決するのですか?

いきなりそのような方法はないと思います。よりクリーンな解決策としては、以下のようなものが考えられます。

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