hg: lambda/lambda/jdk: Update initial lambda APIs and tests to use new syntax.

Peter Levart peter.levart at marand.si
Tue Sep 13 00:20:40 PDT 2011


On 09/13/11, Rémi Forax wrote:
> On 09/12/2011 07:56 PM, Paul Benedict wrote:
> > If I may ask, why is<? super T>  preferable to type<B>?
> 
> Mostly for consistency, the collection API is written in that way.
> Historically, during the development of jdk5, the signatures was using 
> several type variables
> and when wildcards was introduced (near the end), the signatures was 
> changed to their
> actual format.
> 
> I suppose it's because it's more readable once you get use to use wildcards
> (cf Item 28 of Effective Java [1])
> by example
> <T> void copy(List<? super T> dst, List<? extends T> src)
> is in my opinion better than:
> <T, U extends T> void copy(List<T> dst, List<U> src)
> 

What about:

<T> void copy(List<T> dst, List<? extends T> src)

Isn't this the equivalent of:

<T, U extends T> void copy(List<T> dst, List<U> src)

...but using wildcard instead?

Peter

> Rémi
> [1] http://java.sun.com/docs/books/effective/generics.pdf
> 
> >
> > On Sun, Sep 11, 2011 at 9:47 AM, Rémi Forax<forax at univ-mlv.fr>  wrote:
> >> On 09/11/2011 03:04 PM, Brian Goetz wrote:
> >>> Patch eaten by mailing list :(
> >> ok, patch inlined
> >>
> >> Rémi
> >>
> >> diff --git a/src/share/classes/java/util/functions/Block.java
> >> b/src/share/classes/java/util/functions/Block.java
> >> --- a/src/share/classes/java/util/functions/Block.java
> >> +++ b/src/share/classes/java/util/functions/Block.java
> >> @@ -56,7 +56,7 @@
> >>        * @return a Block which performs in sequence the {@code apply}
> >> method of
> >>        * this Block and the {@code apply} method of the specified Block
> >> operation
> >>        */
> >> -<B extends Block<? super T>>  Block<T>  chain(B second) default
> >> Blocks.chain;
> >> +    Block<T>  chain(Block<? super T>  second) default Blocks.chain;
> >>
> >>       /**
> >>        * Returns a Block which performs in sequence the {@code apply}
> >> methods of
> >> @@ -68,7 +68,7 @@
> >>        * this Block and the {@code apply} methods of the specified Block
> >>        * operations
> >>        */
> >> -<B extends Block<? super T>>  Block<T>  chain(B... sequence) default
> >> Blocks.chain;
> >> +    Block<T>  chain(Block<? super T>... sequence) default Blocks.chain;
> >>
> >>       /**
> >>        * Returns a Block which performs in sequence the {@code apply}
> >> methods of
> >> @@ -80,7 +80,7 @@
> >>        * this Block and the {@code apply} methods of the specified Block
> >>        * operations
> >>        */
> >> -<B extends Block<? super T>>  Block<T>  chain(Iterable<B>  sequence)
> >> default Blocks.chain;
> >> +    Block<T>  chain(Iterable<? extends Block<? super T>>  sequence)
> >> default Blocks.chain;
> >>
> >>       /**
> >>        * Returns a Block which repeatedly performs the {@code apply}
> >> method of
> >> diff --git a/src/share/classes/java/util/functions/Blocks.java
> >> b/src/share/classes/java/util/functions/Blocks.java
> >> --- a/src/share/classes/java/util/functions/Blocks.java
> >> +++ b/src/share/classes/java/util/functions/Blocks.java
> >> @@ -87,8 +87,8 @@
> >>        * @return a Block which performs in sequence the {@code first} and
> >>        * {@code second} Blocks
> >>        */
> >> -    public static<B extends Block<? super T>, T>  Block<T>  chain(
> >> -            B first, B second) {
> >> +    public static Block<T>  chain(
> >> +            Block<? super T>  first, Block<? super T>  second) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(second);
> >>
> >> @@ -112,7 +112,7 @@
> >>        * operations
> >>        */
> >>       @SafeVarargs
> >> -    public static<B extends Block<? super T>, T>  Block<T>  chain(B...
> >> sequence) {
> >> +    public static<T>  Block<T>  chain(Block<? super T>... sequence) {
> >>           Objects.requireNonNull(sequence);
> >>           if(0 == sequence.length) {
> >>               return nop();
> >> @@ -133,17 +133,14 @@
> >>        * @param sequence additional Blocks to be chained after the first
> >> Block. A
> >>        * copy is made of the sequence
> >>        * @return  a block that when applied to a {@code t} applies all
> >> of the
> >> -     * specified blocks in sequential oder
> >> +     * specified blocks in sequential order
> >>        */
> >>        @SafeVarargs
> >> -     public static<B extends Block<? super T>, T>  Block<T>  chain(
> >> -            B first, B... sequence) {
> >> +     public static<T>  Block<T>  chain(
> >> +            Block<? super T>  first, Block<? super T>... sequence) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(sequence);
> >> -        if(0 == sequence.length) {
> >> -            return (Block<T>) first;
> >> -        }
> >> -
> >> +
> >>           return t ->  {
> >>               first.apply(t);
> >>               for (B block : sequence)
> >> @@ -159,14 +156,11 @@
> >>        * @param components The blocks to be executed. A copy is made of the
> >>        * components.
> >>        * @return  a block that when applied to a {@code t} applies all
> >> of the
> >> -     * specified blocks in sequential oder.
> >> +     * specified blocks in sequential order.
> >>        */
> >> -    public static<B extends Block<? super T>, T>  Block<T>  chain(
> >> -            Iterable<B>  sequence) {
> >> +    public static<T>  Block<T>  chain(
> >> +            Iterable<? extends Block<? super T>>  sequence) {
> >>           Objects.requireNonNull(sequence);
> >> -        if(!sequence.iterator().hasNext()) {
> >> -            return nop();
> >> -        }
> >>
> >>           return t ->  {
> >>               for (B block : sequence)
> >> @@ -183,10 +177,10 @@
> >>        * @param components The blocks to be executed. A copy is made of the
> >>        * components.
> >>        * @return a block that when applied to a {@code t} applies all of
> >> the
> >> -     * specified blocks in sequential oder.
> >> +     * specified blocks in sequential order.
> >>        */
> >> -     public static<B extends Block<? super T>, T>  Block<T>  chain(
> >> -             Block<? super T>  first, Iterable<B>  sequence) {
> >> +     public static<T>  Block<T>  chain(
> >> +             Block<? super T>  first, Iterable<? extends Block<? super
> >> T>>  sequence) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(sequence);
> >>           if(!sequence.iterator().hasNext()) {
> >> @@ -214,8 +208,9 @@
> >>           if(times<  0) { throw new IllegalArgumentException("negative
> >> times");}
> >>
> >>           return t ->  {
> >> -            for (int i = 0; i<  times; i++)
> >> +            for (int i = 0; i<  times; i++) {
> >>                   block.apply(t);
> >> +            }
> >>           };
> >>       }
> >>
> >> @@ -230,13 +225,14 @@
> >>        * @return a Block which repeatedly performs the {@code apply}
> >> method of
> >>        * this Block.
> >>        */
> >> -    public static<T>  Block<T>  whileRepeat(Block<T>  block, Predicate<?
> >> super T>  decider) {
> >> +    public static<T>  Block<T>  whileRepeat(Block<? super T>  block,
> >> Predicate<? super T>  decider) {
> >>           Objects.requireNonNull(block);
> >>           Objects.requireNonNull(decider);
> >>
> >>           return t ->  {
> >> -            while (decider.eval(t))
> >> +            while (decider.eval(t)) {
> >>                   block.apply(t);
> >> +            }
> >>           };
> >>       }
> >>
> >> @@ -251,7 +247,7 @@
> >>        * @return a Block which repeatedly performs the {@code apply}
> >> method of
> >>        * this Block.
> >>        */
> >> -    public static<T>  Block<T>  repeatUntil(Block<T>  block, Predicate<?
> >> super T>  decider) {
> >> +    public static<T>  Block<T>  repeatUntil(Block<? super T>  block,
> >> Predicate<? super T>  decider) {
> >>           Objects.requireNonNull(block);
> >>           Objects.requireNonNull(decider);
> >>
> >> diff --git a/src/share/classes/java/util/functions/Mappers.java
> >> b/src/share/classes/java/util/functions/Mappers.java
> >> --- a/src/share/classes/java/util/functions/Mappers.java
> >> +++ b/src/share/classes/java/util/functions/Mappers.java
> >> @@ -41,13 +41,13 @@
> >>        * A mapper which who's {@code map} method returns the provided
> >>        * input.
> >>        */
> >> -    public static final Mapper<Object, Object>  IDENTITY = t ->  t;
> >> +    private static final Mapper<Object, Object>  IDENTITY = t ->  t;
> >>
> >>       /**
> >>        * A mapper which performs a mapping from an object to it's
> >>        * string representation.
> >>        */
> >> -    public static final Mapper<Object, String>  STRING =
> >> +    private static final Mapper<Object, String>  STRING =
> >>           t ->  String.valueOf(t);
> >>
> >>       /**
> >> @@ -150,11 +150,11 @@
> >>        * @throws NoSuchMethodException when {@code<U>} has no
> >> constructor which
> >>        * takes a {@code<T>} as a parameter.
> >>        */
> >> -    public static<T, U>  Mapper<T, U>  instantiate(final Class<? extends
> >> T>  clazzT, final Class<? extends U>  clazzU) {
> >> +    public static<T, U>  Mapper<T, U>  instantiate(Class<? extends T>
> >> clazzT, Class<? extends U>  clazzU) {
> >>           Objects.requireNonNull(clazzT);
> >>           Objects.requireNonNull(clazzU);
> >>
> >> -        final Constructor<? extends U>  constructor;
> >> +        Constructor<? extends U>  constructor;
> >>           try {
> >>               constructor = clazzU.getConstructor(clazzT);
> >>           } catch(NoSuchMethodException noConstructor) {
> >> @@ -184,7 +184,7 @@
> >>        * @throws IllegalArgumentException for all values of {@code<T>} not
> >>        * present in the map
> >>        */
> >> -    public static<T, U>  Mapper<T, U>  forMap(final Map<? super T, ?
> >> extends U>  map) {
> >> +    public static<T, U>  Mapper<T, U>  forMap(Map<? super T, ? extends
> >> U>  map) {
> >>           Objects.requireNonNull(map);
> >>
> >>           return t ->  {
> >> @@ -208,13 +208,9 @@
> >>        * @param defaultValue the value returned by {@code map} method for
> >>        * {code<T>} values not contained in the provided map
> >>        */
> >> -    public static<T, U>  Mapper<T, U>  forMap(final Map<? super T, ?
> >> extends U>  map, final U defaultValue) {
> >> +    public static<T, U>  Mapper<T, U>  forMap(Map<? super T, ? extends
> >> U>  map, U defaultValue) {
> >>           Objects.requireNonNull(map);
> >>
> >> -        if(map.isEmpty()) {
> >> -            return constant(defaultValue);
> >> -        }
> >> -
> >>           return t ->  map.containsKey(t) ? map.get(t) : defaultValue;
> >>       }
> >>
> >> diff --git a/src/share/classes/java/util/functions/Predicates.java
> >> b/src/share/classes/java/util/functions/Predicates.java
> >> --- a/src/share/classes/java/util/functions/Predicates.java
> >> +++ b/src/share/classes/java/util/functions/Predicates.java
> >> @@ -40,24 +40,24 @@
> >>        * a predicate that evaluates to {@code true} if the reference
> >>        * being tested is {@code null}.
> >>        */
> >> -    public static final Predicate<Object>  IS_NULL = t ->  t == null;
> >> +    private static final Predicate<Object>  IS_NULL = t ->  t == null;
> >>
> >>       /**
> >>        * a predicate that evaluates to {@code true} if the reference
> >>        * being tested is not {@code null}.
> >>        */
> >> -    public static final Predicate<Object>  NON_NULL = t ->  t != null;
> >> +    private static final Predicate<Object>  NON_NULL = t ->  t != null;
> >>
> >>       /**
> >>        * a predicate who's result is always {@code false}.
> >>        */
> >> -    public static final Predicate<Object>  FALSE = t ->  false;
> >> +    private static final Predicate<Object>  FALSE = t ->  false;
> >>
> >>
> >>       /**
> >>        * a predicate who's result is always {@code true}.
> >>        */
> >> -    public static final Predicate<Object>  TRUE = t ->  true;
> >> +    private static final Predicate<Object>  TRUE = t ->  true;
> >>
> >>       /**
> >>        * singleton utils
> >> @@ -73,8 +73,8 @@
> >>        * @return a predicate that evaluates to {@code true} if the
> >> reference
> >>        * being tested is {@code null}
> >>        */
> >> -    public static Predicate<Object>  isNull() {
> >> -        return IS_NULL;
> >> +    public static<T>  Predicate<T>  isNull() {
> >> +        return (Predicate<T>)IS_NULL;
> >>       }
> >>
> >>       /**
> >> @@ -84,8 +84,8 @@
> >>        * @return a predicate that evaluates to {@code true} if the
> >> reference
> >>        * being tested is is non-{@code null}
> >>        */
> >> -    public static Predicate<Object>  nonNull() {
> >> -        return NON_NULL;
> >> +    public static<T>  Predicate<T>  nonNull() {
> >> +        return (Predicate<T>)NON_NULL;
> >>       }
> >>
> >>       /**
> >> @@ -93,8 +93,8 @@
> >>        *
> >>        * @return a predicate that always evaluates to {@code false}.
> >>        */
> >> -    public static Predicate<Object>  alwaysFalse() {
> >> -        return FALSE;
> >> +    public static<T>  Predicate<T>  alwaysFalse() {
> >> +        return (Predicate<T>)FALSE;
> >>       }
> >>
> >>       /**
> >> @@ -102,8 +102,8 @@
> >>        *
> >>        * @return a predicate that always evaluates to {@code true}.
> >>        */
> >> -    public static Predicate<Object>  alwaysTrue() {
> >> -        return TRUE;
> >> +    public static<T>  Predicate<T>  alwaysTrue() {
> >> +        return (Predicate<T>)TRUE;
> >>       }
> >>
> >>       /**
> >> @@ -115,7 +115,7 @@
> >>        * @return a predicate that evaluates to {@code true} if the
> >> object being
> >>        * tested is an instance of the provided class
> >>        */
> >> -    public static Predicate<Object>  instanceOf(Class<?>  clazz) {
> >> +    public static<T>  Predicate<T>  instanceOf(Class<?>  clazz) {
> >>           return o ->  clazz.isInstance(o);
> >>       }
> >>
> >> @@ -125,7 +125,7 @@
> >>        * @param target The target value to be compared for identity
> >> equality.
> >>        * @return a predicate that who's result is {@code target == object}.
> >>        */
> >> -    public static Predicate<Object>  isSame(Object target) {
> >> +    public static<T>  Predicate<T>  isSame(Object target) {
> >>           return obj ->  obj == target;
> >>       }
> >>
> >> @@ -136,7 +136,7 @@
> >>        * @param t The target value to be compared for equality.
> >>        * @return a predicate who's result matches {@code
> >> Objects.equals(target, t)}
> >>        */
> >> -    public static Predicate<Object>  isEqual(Object target) {
> >> +    public static<T>  Predicate<T>  isEqual(Object target) {
> >>           if (null == target)
> >>               return Predicates.isNull();
> >>           else
> >> @@ -155,7 +155,7 @@
> >>        * is a member of the provided collection. The collection is not
> >> defensively
> >>        * copied so changes to it will alter the behavior of the predicate.
> >>        */
> >> -    public static<T>  Predicate<T>  contains(Collection<? super T>
> >> target) {
> >> +    public static<T>  Predicate<T>  contains(Collection<?>  target) {
> >>           return t ->  target.contains(t);
> >>       }
> >>
> >> @@ -166,7 +166,7 @@
> >>        * @return the composition of the provided mapper and predicate
> >>        */
> >>       public static<T, V>  Predicate<T>  compose(
> >> -            Predicate<V>  predicate, Mapper<T, ? extends V>  mapper) {
> >> +            Predicate<? super V>  predicate, Mapper<? super T, ? extends
> >> V>  mapper) {
> >>           return t ->  predicate.eval(mapper.map(t));
> >>       }
> >>
> >> @@ -180,8 +180,8 @@
> >>        * @return A predicate who's result is the logical inverse of the
> >> provided
> >>        * predicate.
> >>        */
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>  negate(
> >> -            P predicate) {
> >> +    public static<T>  Predicate<T>  negate(
> >> +            Predicate<? super T>  predicate) {
> >>           return t ->  !predicate.eval(t);
> >>       }
> >>
> >> @@ -198,12 +198,8 @@
> >>        * @return A predicate who's result is {@code true} iff all component
> >>        * predicates are {@code true}.
> >>        */
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>  and(
> >> -            Predicate<T>  first,  P second) {
> >> -        if((null != first)&&  (first == second)) {
> >> -            return (Predicate<T>) first;
> >> -        }
> >> -
> >> +    public static<T>  Predicate<T>  and(
> >> +            Predicate<? super T>  first,  Predicate<? super T>  second) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(second);
> >>
> >> @@ -222,13 +218,10 @@
> >>        * @return A predicate who's result is {@code true} iff all component
> >>        * predicates are {@code true}.
> >>        */
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>  and(
> >> -            Iterable<P>  predicates) {
> >> +    public static<T>  Predicate<T>  and(
> >> +            Iterable<? extends Predicate<? super T>>  predicates) {
> >>           Objects.requireNonNull(predicates);
> >> -        if (!predicates.iterator().hasNext()) {
> >> -            throw new IllegalArgumentException("no predicates");
> >> -        }
> >> -
> >> +
> >>           return t ->  {
> >>               for (P predicate : predicates) {
> >>                   if (!predicate.eval(t)) {
> >> @@ -252,13 +245,10 @@
> >>        * @return A predicate who's result is {@code true} iff all component
> >>        * predicates are {@code true}.
> >>        */
> >> -     static<T, P extends Predicate<? super T>>  Predicate<T>  and(
> >> -            P first, Iterable<P>  predicates) {
> >> +     static<T>  Predicate<T>  and(
> >> +            P first, Iterable<? extends Predicate<? super T>>
> >> predicates) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(predicates);
> >> -        if(!predicates.iterator().hasNext()) {
> >> -            return (Predicate<T>) first;
> >> -        }
> >>
> >>           return t ->  {
> >>               if (!first.eval(t)) {
> >> @@ -286,8 +276,8 @@
> >>        * predicates are {@code true}.
> >>        */
> >>        @SafeVarargs
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>  and(
> >> -            P... predicates) {
> >> +    public static<T>  Predicate<T>  and(
> >> +             Predicate<? super T>... predicates) {
> >>           return and(Arrays.asList(predicates));
> >>       }
> >>       /**
> >> @@ -304,8 +294,8 @@
> >>        * predicates are {@code true}.
> >>        */
> >>        @SafeVarargs
> >> -     static<T, P extends Predicate<? super T>>  Predicate<T>  and(
> >> -            P first, P... predicates) {
> >> +     static<T>  Predicate<T>  and(
> >> +            Predicate<? super T>  first, Predicate<? super T>...
> >> predicates) {
> >>           return and(first, Arrays.asList(predicates));
> >>       }
> >>
> >> @@ -322,12 +312,8 @@
> >>        * @return A predicate who's result is {@code true} if any component
> >>        * predicate's result is {@code true}.
> >>        */
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>  or(
> >> -            Predicate<T>  first,  P second) {
> >> -        if((null != first)&&  (first == second)) {
> >> -            return (Predicate<T>) first;
> >> -        }
> >> -
> >> +    public static<T>  Predicate<T>  or(
> >> +            Predicate<? super T>  first,  Predicate<? super T>  second) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(second);
> >>
> >> @@ -346,13 +332,10 @@
> >>        * @return A predicate who's result is {@code true} if any component
> >>        * predicate's result is {@code true}.
> >>        */
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>  or(
> >> -            Iterable<P>  predicates) {
> >> +    public static<T>  Predicate<T>  or(
> >> +            Iterable<? extends Predicate<? super T>>  predicates) {
> >>           Objects.requireNonNull(predicates);
> >> -        if (!predicates.iterator().hasNext()) {
> >> -            throw new IllegalArgumentException("no predicates");
> >> -        }
> >> -
> >> +
> >>           return t ->  {
> >>               for (P predicate : predicates) {
> >>                   if (predicate.eval(t)) {
> >> @@ -375,14 +358,11 @@
> >>        * @return A predicate who's result is {@code true} if any component
> >>        * predicate's result is {@code true}.
> >>        */
> >> -     static<T, P extends Predicate<? super T>>  Predicate<T>  or(
> >> -            P first, Iterable<P>  predicates) {
> >> +     static<T>  Predicate<T>  or(
> >> +            Predicate<? super T>  first, Iterable<? extends Predicate<?
> >> super T>>  predicates) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(predicates);
> >> -        if (!predicates.iterator().hasNext()) {
> >> -            return (Predicate<T>) first;
> >> -        }
> >> -
> >> +
> >>           return t ->  {
> >>               if (first.eval(t)) {
> >>                   return true;
> >> @@ -409,8 +389,8 @@
> >>        * predicate's result is {@code true}.
> >>        */
> >>        @SafeVarargs
> >> -     public static<T, P extends Predicate<? super T>>  Predicate<T>  or(
> >> -            P... predicates) {
> >> +     public static<T>  Predicate<T>  or(
> >> +            Predicate<? super T>... predicates) {
> >>            return or(Arrays.asList(predicates));
> >>        }
> >>
> >> @@ -426,8 +406,8 @@
> >>        * predicate's result is {@code true}.
> >>        */
> >>        @SafeVarargs
> >> -     static<T, P extends Predicate<? super T>>  Predicate<T>  or(
> >> -            P first, P... predicates) {
> >> +     static<T>  Predicate<T>  or(
> >> +            Predicate<? super T>  first, Predicate<? super T>...
> >> predicates) {
> >>           return or(first, Arrays.asList(predicates));
> >>       }
> >>
> >> @@ -444,12 +424,8 @@
> >>        * @return  a predicate that evaluates to {@code false} if all or
> >> none of
> >>        * the component predicates evaluate to {@code true}
> >>        */
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>  xor(
> >> -            Predicate<T>  first, P second) {
> >> -        if((null != first)&&  (first == second)) {
> >> -            return (Predicate<T>) alwaysFalse();
> >> -        }
> >> -
> >> +    public static<T>  Predicate<T>  xor(
> >> +            Predicate<? super T>  first, Predicate<? super T>  second) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(second);
> >>
> >> @@ -468,25 +444,23 @@
> >>        * @return  a predicate that evaluates to {@code false} if all or
> >> none of
> >>        * the component predicates evaluate to {@code true}
> >>        */
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>  xor(
> >> -            Iterable<P>  predicates) {
> >> +    public static<T>  Predicate<T>  xor(
> >> +            Iterable<? extends Predicate<? super T>>  predicates) {
> >>           Objects.requireNonNull(predicates);
> >> -        if(!predicates.iterator().hasNext()) {
> >> -            throw new IllegalArgumentException("no predicates");
> >> -        }
> >> +
> >>
> >>           return t ->  {
> >> -            Boolean initial = null;
> >> -            for (P predicate : predicates) {
> >> -                if (null == initial) {
> >> -                    initial = predicate.eval(t);
> >> -                } else {
> >> -                    if (!(initial ^ predicate.eval(t))) {
> >> -                        return true;
> >> -                    }
> >> +            Iterator<T>  iterator = predicates.iterator();
> >> +            if (!iterator.hasNext()) {
> >> +                return false;
> >> +            }
> >> +            boolean initial = iterator.next().eval(t);
> >> +            while(iterator.hasNext()) {
> >> +                if (!(initial ^ iterator.next().eval(t))) {
> >> +                    return true;
> >>                   }
> >>               }
> >> -            return false;
> >> +            return value;
> >>            };
> >>       }
> >>
> >> @@ -502,8 +476,8 @@
> >>        * @return  a predicate that evaluates to {@code false} if all or
> >> none of the
> >>        * component predicates evaluate to {@code true}
> >>        */
> >> -    static<T, P extends Predicate<? super T>>  Predicate<T>  xor(
> >> -            P first, Iterable<P>  predicates) {
> >> +    static Predicate<T>  xor(
> >> +            P first, Iterable<? extends Predicate<? super T>>
> >> predicates) {
> >>           Objects.requireNonNull(first);
> >>           Objects.requireNonNull(predicates);
> >>
> >> @@ -531,7 +505,7 @@
> >>        * component predicates evaluate to {@code true}
> >>        */
> >>       @SafeVarargs
> >> -    public static<T, P extends Predicate<? super T>>  Predicate<T>
> >> xor(P... predicates) {
> >> +    public static<T>  Predicate<T>  xor(Predicate<? super T>...
> >> predicates) {
> >>           return xor(Arrays.asList(predicates));
> >>       }
> >>
> >> @@ -548,8 +522,8 @@
> >>        * component predicates evaluate to {@code true}
> >>        */
> >>       @SafeVarargs
> >> -     static<T, P extends Predicate<? super T>>  Predicate<T>  xor(
> >> -            P first, P... predicates) {
> >> +     static<T>  Predicate<T>  xor(
> >> +            P first, Predicate<? super T>... predicates) {
> >>           return xor(first, Arrays.asList(predicates));
> >>       }
> >>   }
> >> diff --git a/src/share/classes/java/util/functions/Reducers.java
> >> b/src/share/classes/java/util/functions/Reducers.java
> >> --- a/src/share/classes/java/util/functions/Reducers.java
> >> +++ b/src/share/classes/java/util/functions/Reducers.java
> >> @@ -38,7 +38,7 @@
> >>       /**
> >>        * A reducer who's {@code reduce} method always returns the base.
> >>        */
> >> -    public static final Reducer<Object,Object>  NOP = (u, t) ->  u;
> >> +    private static final Reducer<Object,Object>  NOP = (u, t) ->  u;
> >>
> >>       /**
> >>        * Only utility methods.
> >> @@ -92,7 +92,7 @@
> >>        * @return the composition of the provided mapper and reducer.
> >>        */
> >>       public static<T, U, V>  Reducer<V, U>  compose(
> >> -            Reducer<T, U>  reducer, Mapper<? super V, ? extends T>
> >> mapper) {
> >> +            Reducer<? super T, U>  reducer, Mapper<? super V, ? extends
> >> T>  mapper) {
> >>           Objects.requireNonNull(reducer);
> >>           Objects.requireNonNull(mapper);
> >>
> >> @@ -116,7 +116,7 @@
> >>        * reducer.
> >>        */
> >>       public static<T, U>  Reducer<T,U>  compose(
> >> -            Reducer<T, U>  reducer, Predicate<? super T>  predicate) {
> >> +            Reducer<? super T, U>  reducer, Predicate<? super T>
> >> predicate) {
> >>           Objects.requireNonNull(reducer);
> >>           Objects.requireNonNull(predicate);
> >>
> >>
> >>> On 9/11/2011 7:59 AM, Rémi Forax wrote:
> >>>> better with the patch
> >>>>
> >>>> Rémi
> >>>>
> >>>> On 09/11/2011 01:52 PM, Rémi Forax wrote:
> >>>>> Hi all,
> >>>>> I've tried to fix some bugs of the current implementation of
> >>>>> java.util.functions.
> >>>>>
> >>>>> - some constants are still public
> >>>>> (BTW, when the compiler will be able to generate the correct bytecode
> >>>>> for a lambda, these constants will be not needed any more
> >>>>> because constant lambda will be constant by default)
> >>>>> - a lot of generic signature aren't right and there is inconsistency
> >>>>> between the files.
> >>>>> - some casts are wrong, you can't cast a Predicate<? super T>  to
> >>>>> a Predicate<T>, it's not safe.
> >>>>> - some methods return a Predicate<Object>  instead of a
> >>>>> Predicate<T>  so it will not work if the predicate is used by example
> >>>>> in a ?:
> >>>>> - some short cuts in the implementation are wrong (by example,
> >>>>> testing if there is an element in an iterable before creating
> >>>>> the lambda is wrong because the iterable can be populated
> >>>>> before the lambda is called.
> >>>>> - fix some implementations, BTW I think the methods xor should be
> >>>>> removed
> >>>>> for the same reason there is no ^^ in C
> >>>>> (nobody use xor in test between booleans)
> >>>>>
> >>>>> cheers,
> >>>>> Rémi
> >>>>>
> >>>>> On 09/10/2011 03:49 AM, stuart.marks at oracle.com wrote:
> >>>>>> Changeset: d9e4e3c106a7
> >>>>>> Author: smarks
> >>>>>> Date: 2011-09-09 18:48 -0700
> >>>>>> URL: http://hg.openjdk.java.net/lambda/lambda/jdk/rev/d9e4e3c106a7
> >>>>>>
> >>>>>> Update initial lambda APIs and tests to use new syntax.
> >>>>>>
> >>>>>> ! src/share/classes/java/util/functions/Blocks.java
> >>>>>> ! src/share/classes/java/util/functions/Mappers.java
> >>>>>> ! src/share/classes/java/util/functions/Predicates.java
> >>>>>> ! src/share/classes/java/util/functions/Reducers.java
> >>>>>> ! test/java/util/Collection/Extensions.java
> >>>>>> ! test/java/util/Collection/MOAT.java
> >>>>>> ! test/java/util/List/Extensions.java
> >>>>>> ! test/java/util/functions/Block/BlocksTest.java
> >>>>>> ! test/java/util/functions/Mapper/MappersTest.java
> >>>>>> ! test/java/util/functions/Predicate/PredicatesTest.java
> >>>>>> ! test/java/util/functions/Reducer/ReducersTest.java
> >>>>>>
> >>>>>>
> >>>>
> >>>>
> >>>>
> >>
> >>
> >>> On 9/11/2011 7:59 AM, Rémi Forax wrote:
> >>>> better with the patch :)
> >>>>
> >>>> Rémi
> >>>>
> >>>> On 09/11/2011 01:52 PM, Rémi Forax wrote:
> >>>>> Hi all,
> >>>>> I've tried to fix some bugs of the current implementation of
> >>>>> java.util.functions.
> >>>>>
> >>>>> - some constants are still public
> >>>>> (BTW, when the compiler will be able to generate the correct bytecode
> >>>>> for a lambda, these constants will be not needed any more
> >>>>> because constant lambda will be constant by default)
> >>>>> - a lot of generic signature aren't right and there is inconsistency
> >>>>> between the files.
> >>>>> - some casts are wrong, you can't cast a Predicate<? super T>  to
> >>>>> a Predicate<T>, it's not safe.
> >>>>> - some methods return a Predicate<Object>  instead of a
> >>>>> Predicate<T>  so it will not work if the predicate is used by example
> >>>>> in a ?:
> >>>>> - some short cuts in the implementation are wrong (by example,
> >>>>> testing if there is an element in an iterable before creating
> >>>>> the lambda is wrong because the iterable can be populated
> >>>>> before the lambda is called.
> >>>>> - fix some implementations, BTW I think the methods xor should be
> >>>>> removed
> >>>>> for the same reason there is no ^^ in C
> >>>>> (nobody use xor in test between booleans)
> >>>>>
> >>>>> cheers,
> >>>>> Rémi
> >>>>>
> >>>>> On 09/10/2011 03:49 AM, stuart.marks at oracle.com wrote:
> >>>>>> Changeset: d9e4e3c106a7
> >>>>>> Author: smarks
> >>>>>> Date: 2011-09-09 18:48 -0700
> >>>>>> URL: http://hg.openjdk.java.net/lambda/lambda/jdk/rev/d9e4e3c106a7
> >>>>>>
> >>>>>> Update initial lambda APIs and tests to use new syntax.
> >>>>>>
> >>>>>> ! src/share/classes/java/util/functions/Blocks.java
> >>>>>> ! src/share/classes/java/util/functions/Mappers.java
> >>>>>> ! src/share/classes/java/util/functions/Predicates.java
> >>>>>> ! src/share/classes/java/util/functions/Reducers.java
> >>>>>> ! test/java/util/Collection/Extensions.java
> >>>>>> ! test/java/util/Collection/MOAT.java
> >>>>>> ! test/java/util/List/Extensions.java
> >>>>>> ! test/java/util/functions/Block/BlocksTest.java
> >>>>>> ! test/java/util/functions/Mapper/MappersTest.java
> >>>>>> ! test/java/util/functions/Predicate/PredicatesTest.java
> >>>>>> ! test/java/util/functions/Reducer/ReducersTest.java
> >>>>>>
> >>>>>>
> >>>>
> >>>>
> >>>>
> >>
> >>
> 
> 
> 


More information about the lambda-dev mailing list