Convert old "into" code to the collectors

Paul Sandoz paul.sandoz at oracle.com
Wed Jan 16 08:17:12 PST 2013


On Jan 16, 2013, at 5:10 PM, Michael Nascimento <misterm at gmail.com> wrote:

> Since you have an existing instance, you can do:
> 
> toCollection(() -> propriedades)
> 

That will break the contract and the results will be undefined when going parallel.

When going parallel multiple instances of the collection will need to be created and those instances will be merged together.

Paul.

> Regards,
> Michael
> 
> On Wed, Jan 16, 2013 at 1:59 PM, Paul Sandoz <paul.sandoz at oracle.com> wrote:
>> You are wiring up the wrong parameters to both toCollection and toList.
>> 
>> Here are the relevant methods:
>> 
>>    public static<T, C extends Collection<T>>
>>    Collector<T,C> toCollection(Supplier<C> collectionFactory) {
>>        return leftCombiningReducer(collectionFactory, Collection::add, Collection::addAll);
>>    }
>> 
>>    public static<T>
>>    Collector<T,List<T>> toList() {
>>        // @@@ Consider a tree-based List, if we can solve the post-processing problem
>>        return toCollection(ArrayList<T>::new);
>>    }
>> 
>> The former takes a supplier:
>> 
>>  Collectors.<...>toCollection(ArrayList<...>::new);
>> 
>> The latter takes no parameters:
>> 
>>  Collectors.<...>toList();
>> 
>> Notice how the latter calls the former.
>> 
>> Hth,
>> Paul.
>> 
>> 
>> On Jan 16, 2013, at 4:41 PM, Marcos Antonio <marcos_antonio_ps at hotmail.com> wrote:
>> 
>>> 
>>> Here are the compiler error messages for the two case:
>>> 
>>> List<PropriedadeChavePai> propriedadesChavePai = new ArrayList<>();
>>> 
>>> chave.getPropriedadesChavePai().stream().
>>>   map(PropriedadeChavePai::new).
>>>   collect(Collectors.<PropriedadeChavePai>toCollection(propriedadesChavePai));
>>> 
>>> [javac] C:\desenvolvimento\desktop\desenvolvimento\br\desenvolvimento\dados\CriadorChave.java:259: error: method toCollection in class Collectors cannot be applied to given types;
>>> [javac]       collect(Collectors.<PropriedadeChavePai>toCollection(propriedadesChavePai));
>>> [javac]                         ^
>>> [javac]   required: Supplier<C>
>>> [javac]   found: List<PropriedadeChavePai>
>>> [javac]   reason: actual and formal argument lists differ in length
>>> [javac]   where C,T are type-variables:
>>> [javac]     C extends Collection<T> declared in method <T,C>toCollection(Supplier<C>)
>>> [javac]     T extends Object declared in method <T,C>toCollection(Supplier<C>)
>>> [javac] 1 error
>>> 
>>> --------------------------------------------------------------------------
>>> 
>>> List<PropriedadeChavePai> propriedadesChavePai = new ArrayList<>();
>>> 
>>> chave.getPropriedadesChavePai().stream().
>>>   map(PropriedadeChavePai::new).
>>>   collect(Collectors.<PropriedadeChavePai>toList(propriedadesChavePai));
>>> 
>>> [javac] C:\desenvolvimento\desktop\desenvolvimento\br\desenvolvimento\dados\CriadorChave.java:259: error: method toList in class Collectors cannot be applied to given types;
>>> [javac]       collect(Collectors.<PropriedadeChavePai>toList(propriedadesChavePai));
>>> [javac]                         ^
>>> [javac]   required: no arguments
>>> [javac]   found: List<PropriedadeChavePai>
>>> [javac]   reason: actual and formal argument lists differ in length
>>> [javac] 1 error
>>> 
>>> Marcos
>>> 
>>> ----------------------------------------
>>>> Date: Wed, 16 Jan 2013 15:05:22 +0000
>>>> From: maurizio.cimadamore at oracle.com
>>>> To: marcos_antonio_ps at hotmail.com
>>>> CC: lambda-dev at openjdk.java.net
>>>> Subject: Re: Convert old "into" code to the collectors
>>>> 
>>>> On 16/01/13 14:34, Marcos Antonio wrote:
>>>>> Hello, everybody!
>>>>> 
>>>>> Before build b73 I had code like this:
>>>>> 
>>>>> List<PropriedadeChavePai> propriedades = new ArrayList<>();
>>>>> 
>>>>> chave.getPropriedadesChavePai().stream().
>>>>> map(PropriedadeChavePai::new).
>>>>> into(propriedades);
>>>>> 
>>>>> Now I'm having trouble trying to convert it to use the new Collectors. I have tried something like this:
>>>>> 
>>>>> chave.getPropriedadesChavePai().stream().
>>>>> map(PropriedadeChavePai::new).
>>>>> collect(Collectors.toCollection(propriedades));
>>>>> 
>>>>> but it didn't work and I couldn't figure out the right thing to do.
>>>>> 
>>>>> Thank you in advance.
>>>>> 
>>>>> Marcos
>>>>> 
>>>> What do you mean it didn't work? Did you get an error message from the
>>>> compiler? If so, can you please paste it?
>>>> 
>>>> Maurizio
>>> 
>> 
>> 



More information about the lambda-dev mailing list