Hi Viktor,

stream.filter(myClass:isInstance).map(myClass:cast)

is indeed the current way of doing it. I've written this code many times
and I suspect others have too. An extracted version might reside in many
utility classes. This is why I suggested having a Gatherer for it in
Gatherers. I've written a naive implementation:

private static <T, R> Gatherer<T, ?, R> filterCast(Class<R> type) {
    return Gatherer.of(
        (_, element, downstream) -> {
            if (type.isInstance(element)) {
                return downstream.push(type.cast(element));
            }
            return true;
        }
    );
}

which we might start seeing in gatherer libraries.

We don't need to be able to write 'x instanceof T', although it would be
useful in many cases. It's a discussion for Valhalla. Valhalla will also
allow us to use this for "non-class based" elements when generics over
primitives arrive, so this gatherer is no different than the others.

As noted above, Amber might offer solutions too. Obviously, lower-level
solutions from Valhalla and Amber are preferable, but I don't know what the
plans are. Maybe you can discuss this internally. Otherwise, do you think
this is a good fit?

-- Nir

On Mon, Apr 28, 2025 at 12:02 PM Viktor Klang <viktor.kl...@oracle.com>
wrote:

> The challenge here is that there is no, current, reification of a pattern
> application, so all it boils down to at this point is: given a Predicate
> for some type T, make a cast to some unrelated type R.
>
> For Class-based retention of elements, it is possible to do the equivalent
> of testing Class::isInstance(element) and then push the element downstream
> after a Class::cast(element)
>
> Cheers,
> √
>
>
> *Viktor Klang*
> Software Architect, Java Platform Group
> Oracle
> ------------------------------
> *From:* core-libs-dev <core-libs-dev-r...@openjdk.org> on behalf of Nir
> Lisker <nlis...@gmail.com>
> *Sent:* Saturday, 26 April 2025 20:55
> *To:* core-libs-dev@openjdk.org <core-libs-dev@openjdk.org>
> *Subject:* Casting gatherer
>
> Hi,
>
> instanceof has been refitted to include an auto-cast ("pattern matching on
> instanceof"). Unfortunately, doing this as an intermediate operation on a
> stream requires first to filter via instanceof and then map via a cast.
> This is because
>
>     x instanceof MyClass myClass
>
> returns a boolean, not myClass.
>
> I've asked for an easier way of doing it long ago directly on Stream and
> was declined, but now with Gatherers I'm bringing this up again. I think it
> would be reasonable to put such an operation in the Gatherers class. I
> imagine that many Gatherer libraries, or utility classes, will include it
> since it's a common operation, and having it in the JDK means that it'll be
> done the best way possible (you can optimize where others can't, if
> applicable here).
>
> -- Nir
>

Reply via email to