Additional method on Stream
Paul Sandoz
paul.sandoz at oracle.com
Mon Apr 27 13:41:37 UTC 2015
Hi Stephen,
You can do this:
static <T> Function<Object, Stream<T>> casting(Class<T> c) { // bike shed for clearer name
return o -> Stream.ofNullable(c.isInstance(o) ? c.cast(o) : null);
}
Object[] s = Stream.of(1, 2, "3", 4).toArray();
Stream.of(s).flatMap(casting(Integer.class)).
forEach(System.out::println);
I am a bit reluctant to add such a specific kind of filter method to Stream when one can do the above.
In general my preference is to keep the stream operation methods as general as possible.
Paul.
On Apr 27, 2015, at 3:22 PM, Stephen Colebourne <scolebourne at joda.org> wrote:
> This is a request for an additional method on java.util.stream.Stream.
>
> Having written quite a bit of code in Java 8 now, one annoyance keeps
> on coming up, filtering and casting the stream.
>
> Currently, it is necessary to do this:
>
> return input.stream()
> .filter(Foo.class::isInstance)
> .map(Foo.class::cast)
> .someTerminalOperation();
>
> or
>
> return input.stream()
> .filter(t -> t instanceof Foo)
> .map(t -> (Foo) t)
> .someTerminalOperation();
>
> Really, what is needed is this:
>
> return input.stream()
> .filter(Foo.class)
> .someTerminalOperation();
>
> For info, Guava's FluentIterable has such a method.
>
> The new method signature would be something like:
>
> public Stream<R> filter(Class<R> cls);
>
> As far as I can see, there is no problem in implementing this in both
> serial and parallel modes, as it is essentially just a convenience.
>
> Thoughts?
> Stephen
More information about the core-libs-dev
mailing list