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 <scolebou...@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