Scala provides a filterNot method as a work around. This is a less generic fix, 
but arguably more pragmatic for the common case of the streams API. 

Sent from Yahoo Mail on Android

From:"Attila Szegedi" <attila.szeg...@oracle.com>
Date:Wed, May 6, 2015 at 4:59 am
Subject:Re: Add Predicate.of(), Consumer.of(), etc.

On May 6, 2015, at 12:37 PM, Paul Sandoz <paul.san...@oracle.com> wrote:
> 
> 
> On May 2, 2015, at 11:31 PM, Remi Forax <fo...@univ-mlv.fr> wrote:
> 
>> Hi all,
>> today, I stubble on a variant of JDK-8050818 [1],
>> trying to call negate() on a lambda which is not yet a Predicate (due to 
>> target typing) which requires either to cast the lambda to a Predicate and 
>> everybody knows that cast are evil or to add a local variable.
>> 
>> I think there is a way to fix that, it's not very orthodox so I let you 
>> judge.
>> The idea is to introduce a static method 'of' on Predicate,
>> class Predicate<T> {
>>  ...
>>  public static <T> Predicate<T> of(Predicate<T> predicate) {
>>    return predicate;
>>  }
>> }
>> 
>> so one can write:
>> stream.filter(Predicate.of(String::isEmpty).negate())
>> compared to
>> stream.filter(((Predicate<String>)String::isEmpty).negate())
>> 
>> so the question is, does it it worth the cost to introduce a static method 
>> that basically do nothing on all functional interfaces of java.util.function.
>> 
> 
> That does have the virtue of not adding a static method per operation but i 
> still cannot bring myself to add such methods as a work around for seems like 
> a compiler inference problem (albeit one in which might be very tricky or not 
> possible to solve).

I think it is firmly in the category of “very tricky”, but probably still 
possible, albeit (from my point of view) undesirable.

String::isEmpty will not, on its own, have a method named .negate(); the 
compiler can’t really infer the programmer’s intent to make it into a 
Predicate, not without a fairly high level reasoning (filter needs a Predicate; 
should the compiler perform an exhaustive search of the visible functional 
interfaces to see which one has a method with signature “Predicate negate()”?). 
So, yeah, it seems like in this case the programmer needs to communicate the 
intent. 

I think inference would be *possible*, but it’d be expensive, and would still 
allow for either ambiguities or accidentally matching something unexpected, so 
I think it would also be undesirable.

I don’t have an opinion of whether we want an “of” static method on Predicate, 
as then it would have to indeed be introduced on many other interfaces. It’s 
more appealing than a cast, certainly; especially since the cast apparently 
needs to specify the explicit type parameter too.

> 
> In some respects i wonder if the default methods on the functional interfaces 
> are an attractive nuisance.

Meaning, if .negate(Predicate) were a static method on the Predicate class 
instead of a default method, then 
stream.filter(Predicate.negate(String::isEmpty)) would be possible? Yeah…

Attila.



> 
> Paul.
> 


Reply via email to