Additional method on Stream
Stephen Colebourne
scolebourne at joda.org
Mon Apr 27 14:56:28 UTC 2015
Obviously, this is yet another possible workaround. But it is a
workaround. There really aren't that many rough edges with the set of
methods added with lambdas, but this is definitely one. That Guava
handled it specially is another good indication.
BTW, I wait months before making this request to see if it really was
common enough a pattern, but I'm confident that it is now.
Stephen
On 27 April 2015 at 14:41, Paul Sandoz <paul.sandoz at oracle.com> wrote:
> 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