[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-lambda-dev
Subject:    hg: lambda/lambda/jdk: Update initial lambda APIs and tests to use new syntax.
From:       tronicek () fit ! cvut ! cz (=?utf-8?B?IlpkZW7Em2sgVHJvbsOtxI1layI=?=)
Date:       2011-09-13 8:40:49
Message-ID: 36fb05f4099978646fbbfd377827f4b8.squirrel () imap ! fit ! cvut ! cz
[Download RAW message or body]

R?mi Forax napsal(a):
> 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)

I think the reason is flexibility. For example,

List<Number> dst = new ArrayList<>();
List<? extends Number> src = ...;  // invocation of the method that
returns List<? extends Number>
copy(dst, src);

If there was List<Number> instead of List<? extends Number> in the copy
method, it could not compile.

Z.
-- 
Zdenek Tronicek
FIT CTU in Prague


> 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
>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>>>
>>>
>>>
>
>
>
>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic