Convert old "into" code to the collectors

Paul Sandoz paul.sandoz at oracle.com
Wed Jan 16 08:57:59 PST 2013


On Jan 16, 2013, at 5:25 PM, Marcos Antonio <marcos_antonio_ps at hotmail.com> wrote:

> 
> So the bottom line is that I cannot use an existing collection anymore as I used to do with the "into" method, right?
> Are there any alternatives?
> 

The simplest way to add to an existing collection *sequentially* is to do:

  Collection c = ...
  s.forEach(c::add);

If you are going parallel then you will need to place a sequential barrier before the forEach:

  parStream.sequential().forEach(c:add);

Paul.

> For the time being, this is my workaround:
> 
> propriedadesChavePai.addAll(
>    chave.getPropriedadesChavePai().stream().
>        map(PropriedadeChavePai::new).
>        collect(Collectors.<PropriedadeChavePai>toList())
> );
> 
> Very bulky.
> 
> Marcos
> 
> ----------------------------------------
>> Date: Wed, 16 Jan 2013 15:58:29 +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
>> 
>> 
>> I think the toCollection method is designed to convert a constructor
>> reference (passed as a Supplier) into a new Collector, which is used to
>> carry out the 'collect' operation. In other words, I don't think you can
>> pass a plain collection to 'toCollection'.
>> 
>> Maurizio
>> 
>> 
>> On 16/01/13 15:41, Marcos Antonio 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