Re: [Jug-Torino] Tuples in Java 8 streams

2018-12-06 Thread Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug]
Cosi' e' e non c'e' molto da fare, ma in realta' il mio caso d'uso
funzionava benissimo con le static inner class.

Avevo definito gli oggetti immutabili di dominio come interfacce in un
bundle (modulo) shared, ogni bundle che doveva crearne una istanza (per
esempio il DAO e il modulo che riceveva json) non faceva altro che creare
una anonymous class di quella interfaccia e restituirla.
In questo modo mi evitavo di sherare la classe o di dover avere
l'interfaccia implementata in diversi moduli.

Essendo passato a kotlin non ho piu' il problema e con Valhalla sparira'
anche in Java.

Uberto

On Mon, 3 Dec 2018 at 08:38, Matteo Vaccari matteo.vacc...@gmail.com
[it-torino-java-jug]  wrote:

>
>
> Credo che sia utile immaginare le inner class anonime come delle closure.
>
> Nel tuo esempio: restituisci un'istanza di un'inner class anonima, ed e'
> una buona cosa che in quella inner class tu possa accedere alle variabili
> della classe dentro a cui la costruisci; altrimenti l'utilita' di poter
> costruire una inner class anonima al volo e' limitata.
>
> On Sun, Dec 2, 2018 at 11:11 PM Uberto Barbini uberto..g...@gmail.com
>  [it-torino-java-jug] <
> it-torino-java-jug@yahoogroups.com> wrote:
>
>>
>>
>> Ciao Federico e grazie per le interessanti osservazioni.
>>
>> Sinceramente a me non interessa moltissimo il "trucco" delle tuple
>> anonime, carino ma insomma non lo userei in produzione, leak o non leak.
>>
>> Il pattern del doppio curlybraces poi non l'ho mai potuto soffrire.
>>
>> La cosa che invece mi ha un po' preoccupato e' l'idea che implementando
>> una interfaccia al volo mando in giro un riferimento all'istanza della
>> classe che l'ha creata.
>>
>> Per dire codice tipo questo:
>> https://gist.github.com/uberto/c37970ba1d3b49c61568809085a84d1f
>>
>> Ecco codice cosi' io l'ho scritto in produzione e non avevo idea che
>> stavo mandando in giro un riferimento alla classe creatrice.
>>
>> Per curiosita' ho provato con un metodo statico e in questo caso la
>> classe anonima creata non ha un riferimento alla factory. Penso sia una
>> static inner class ma non so se c'e' un modo sicuro per dirlo.
>>
>> Uberto
>>
>>
>>
>>
>>
>>
>>
>> On Sun, 2 Dec 2018 at 11:28, Federico Fissore feder...@fsfe.org
>> [it-torino-java-jug]  wrote:
>>
>>>
>>>
>>> Matteo Vaccari matteo.vacc...@gmail.com [it-torino-java-jug] ha scritto
>>> il 01/12/18 alle 19:42:
>>> >
>>> > Non e' ovvio! Grazie per avermelo ricordato.
>>> >
>>>
>>> Prego e grazie per il grazie. Come dice il saggio, è l'unica parola che
>>> non perde mai valore, anche detta migliaia di volte.
>>>
>>> Mi scuso se ho dato per scontato che parlavo di istanze di classi e non
>>> solo di classi
>>>
>>> Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug] ha scritto il
>>> 02/12/18 alle 11:24:
>>> >
>>> > credo che se le fai generare da un metodo statico sei tranquillo, ma
>>> > vorrei fare dei tests più approfonditi...
>>> >
>>>
>>> Bella domanda
>>>
>>> Ho provato a modificare lo snippet condiviso prima: se dichiari static
>>> il metodo Filter3.filter, il compilatore va in errore alla riga "return
>>> Filter3.this.sayHi()". Che ha senso: se la inner class viene usata in un
>>> metodo statico, non c'è istanza a cui fare riferimento
>>>
>>> Allora ho fatto un'altra prova usando questo snippet
>>>
>>> https://gist.github.com/ffissore/f410842f6e83e31c326889155e5162b6
>>>
>>> e ho scoperto una cosa che non sapevo: fra i "campi nascosti" che ti
>>> becchi con una inner class c'è anche la "v" (String) usata nel metodo
>>> map dello stream (accessibile con it.jugtorino.Filter4$1.val$v). Che di
>>> nuovo non è banale, se l'intenzione del programmatore era destrutturare
>>> un oggetto ricco e complesso, per fornire al chiamate solo quelle "2
>>> cose che gli servono"
>>>
>>> federico
>>>
>> 
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-12-02 Thread Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug]
Ciao Federico e grazie per le interessanti osservazioni.

Sinceramente a me non interessa moltissimo il "trucco" delle tuple anonime,
carino ma insomma non lo userei in produzione, leak o non leak.

Il pattern del doppio curlybraces poi non l'ho mai potuto soffrire.

La cosa che invece mi ha un po' preoccupato e' l'idea che implementando una
interfaccia al volo mando in giro un riferimento all'istanza della classe
che l'ha creata.

Per dire codice tipo questo:
https://gist.github.com/uberto/c37970ba1d3b49c61568809085a84d1f

Ecco codice cosi' io l'ho scritto in produzione e non avevo idea che stavo
mandando in giro un riferimento alla classe creatrice.

Per curiosita' ho provato con un metodo statico e in questo caso la classe
anonima creata non ha un riferimento alla factory. Penso sia una static
inner class ma non so se c'e' un modo sicuro per dirlo.

Uberto







On Sun, 2 Dec 2018 at 11:28, Federico Fissore feder...@fsfe.org
[it-torino-java-jug]  wrote:

>
>
> Matteo Vaccari matteo.vacc...@gmail.com [it-torino-java-jug] ha scritto
> il 01/12/18 alle 19:42:
> >
> > Non e' ovvio! Grazie per avermelo ricordato.
> >
>
> Prego e grazie per il grazie. Come dice il saggio, è l'unica parola che
> non perde mai valore, anche detta migliaia di volte.
>
> Mi scuso se ho dato per scontato che parlavo di istanze di classi e non
> solo di classi
>
> Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug] ha scritto il
> 02/12/18 alle 11:24:
> >
> > credo che se le fai generare da un metodo statico sei tranquillo, ma
> > vorrei fare dei tests più approfonditi...
> >
>
> Bella domanda
>
> Ho provato a modificare lo snippet condiviso prima: se dichiari static
> il metodo Filter3.filter, il compilatore va in errore alla riga "return
> Filter3.this.sayHi()". Che ha senso: se la inner class viene usata in un
> metodo statico, non c'è istanza a cui fare riferimento
>
> Allora ho fatto un'altra prova usando questo snippet
>
> https://gist.github.com/ffissore/f410842f6e83e31c326889155e5162b6
>
> e ho scoperto una cosa che non sapevo: fra i "campi nascosti" che ti
> becchi con una inner class c'è anche la "v" (String) usata nel metodo
> map dello stream (accessibile con it.jugtorino.Filter4$1.val$v). Che di
> nuovo non è banale, se l'intenzione del programmatore era destrutturare
> un oggetto ricco e complesso, per fornire al chiamate solo quelle "2
> cose che gli servono"
>
> federico
> 
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-12-02 Thread Federico Fissore feder...@fsfe.org [it-torino-java-jug]
Matteo Vaccari matteo.vacc...@gmail.com [it-torino-java-jug] ha scritto 
il 01/12/18 alle 19:42:
 >
 > Non e' ovvio!  Grazie per avermelo ricordato.
 >

Prego e grazie per il grazie. Come dice il saggio, è l'unica parola che 
non perde mai valore, anche detta migliaia di volte.

Mi scuso se ho dato per scontato che parlavo di istanze di classi e non 
solo di classi


Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug] ha scritto il 
02/12/18 alle 11:24:
> 
> credo che se le fai generare da un metodo statico sei tranquillo, ma 
> vorrei fare dei tests più approfonditi...
> 

Bella domanda

Ho provato a modificare lo snippet condiviso prima: se dichiari static 
il metodo Filter3.filter, il compilatore va in errore alla riga "return 
Filter3.this.sayHi()". Che ha senso: se la inner class viene usata in un 
metodo statico, non c'è istanza a cui fare riferimento

Allora ho fatto un'altra prova usando questo snippet

https://gist.github.com/ffissore/f410842f6e83e31c326889155e5162b6

e ho scoperto una cosa che non sapevo: fra i "campi nascosti" che ti 
becchi con una inner class c'è anche la "v" (String) usata nel metodo 
map dello stream (accessibile con it.jugtorino.Filter4$1.val$v). Che di 
nuovo non è banale, se l'intenzione del programmatore era destrutturare 
un oggetto ricco e complesso, per fornire al chiamate solo quelle "2 
cose che gli servono"

federico


Re: [Jug-Torino] Tuples in Java 8 streams

2018-12-02 Thread Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug]
esatto. sinceramente non avevo mai fatto che le classi anonime fossero
anche inner class.

non lo chiamerei esattamente memory leak perché non perdi l'accesso alla
referenza, però è da tener presente.

credo che se le fai generare da un metodo statico sei tranquillo, ma vorrei
fare dei tests più approfonditi...

Uberto

On Sat, 1 Dec 2018, 18:43 Matteo Vaccari matteo.vacc...@gmail.com
[it-torino-java-jug] 
>
> Ah ho capito.
>
> Le classi anonime sono inner class, e quindi hanno un riferimento
>> alla classe padre, piaccia o no
>
>
> Non e'  il riferimento alla classe padre che puo' causare un leak, e' che
> *l'istanza* della classe anonima contiene un riferimento all'*istanza* della
> classe che la contiene.  Quindi se tu conservi un riferimento all'istanza
> della classe anonima, stai tenendo in vita anche l'oggetto che l'ha
> generata.
>
> Non e' ovvio!  Grazie per avermelo ricordato.
>
>
> On Sat, Dec 1, 2018 at 7:30 PM Matteo Vaccari 
> wrote:
>
>> Spiegatemi questa cosa perché temo di non averla capita: se io creo una
>> classe anonima con new Object() {  }, la classe viene creata una volta
>> per tutte, indipendentemente dal numero di volte che il frammento di codice
>> viene eseguito?  Oppure viene creata una classe nuova ogni volta che lo
>> esegui?
>>
>> Per come avevo capito io le classi anonime direi la prima.  Anzi ero
>> sicurissimo della prima.  Ma se e' cosi', non capisco dove sia il memory
>> leak.
>>
>> On Sat, Dec 1, 2018 at 1:48 PM Federico Fissore feder...@fsfe.org
>> [it-torino-java-jug]  wrote:
>>
>>>
>>>
>>> Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug] ha scritto il
>>> > In tutti i casi pero', anche se volessi restituire una collezione di
>>> > Object non c'e' memory leak comunque, non sono inner class ma classi
>>> > anonime senza alcun rapporto con la classe principale.
>>> > C'e' una inner class creata implicitamente dalla lambda, ma quella
>>> > finisce col ciclo.
>>>
>>> Le classi anonime sono inner class, e quindi hanno un riferimento alla
>>> classe padre, piaccia o no
>>> Quello che descrivi invece è una static inner class, che però non può
>>> essere anonima
>>>
>>> Visto che la tupla dell'esempio di Simone non è utile a tornare dati,
>>> cambio l'esempio usando una mappa e la sintassi delle doppie parentesi
>>> graffe
>>>
>>> https://gist.github.com/ffissore/e4915691cc539b0954faf815609cdceb
>>>
>>> "...new HashMap() {..." è una inner class, anonima, e può accedere alla
>>> classe genitore con la sintassi "Filter3.this."
>>> Nel metodo "inspectInOtherMethod", l'instanza di Filter3 non è
>>> raggiungibile, eppure la mappa restituita è in grado di accedere ai suoi
>>> metodi.
>>>
>>> Se serve altra letteratura a proposito, Lukas Eder in questo post lo
>>> spiega bene [1]. Si focalizza sulle doppie parentesi graffe, ma solo
>>> perchè sono la sintassi più compatta per ottenere qualcosa di simile a
>>> una Tupla in java. La sorgente del problema memory leak è l'aver tornato
>>> un'istanza di una inner class
>>>
>>> [1]
>>>
>>> https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/
>>>
>>> NB: se nelle vostre codebase usate la sintassi delle doppie graffe,
>>> buttatele e migrate o a "ImmutableMap.of" di Guava, o fatevi il vostro
>>> metodo di utilità
>>>
>>> federico
>>>
>> 
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-12-01 Thread Matteo Vaccari matteo.vacc...@gmail.com [it-torino-java-jug]
Ah ho capito.

Le classi anonime sono inner class, e quindi hanno un riferimento
> alla classe padre, piaccia o no


Non e'  il riferimento alla classe padre che puo' causare un leak, e' che
*l'istanza* della classe anonima contiene un riferimento all'*istanza* della
classe che la contiene.  Quindi se tu conservi un riferimento all'istanza
della classe anonima, stai tenendo in vita anche l'oggetto che l'ha
generata.

Non e' ovvio!  Grazie per avermelo ricordato.


On Sat, Dec 1, 2018 at 7:30 PM Matteo Vaccari 
wrote:

> Spiegatemi questa cosa perché temo di non averla capita: se io creo una
> classe anonima con new Object() {  }, la classe viene creata una volta
> per tutte, indipendentemente dal numero di volte che il frammento di codice
> viene eseguito?  Oppure viene creata una classe nuova ogni volta che lo
> esegui?
>
> Per come avevo capito io le classi anonime direi la prima.  Anzi ero
> sicurissimo della prima.  Ma se e' cosi', non capisco dove sia il memory
> leak.
>
> On Sat, Dec 1, 2018 at 1:48 PM Federico Fissore feder...@fsfe.org
> [it-torino-java-jug]  wrote:
>
>>
>>
>> Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug] ha scritto il
>> > In tutti i casi pero', anche se volessi restituire una collezione di
>> > Object non c'e' memory leak comunque, non sono inner class ma classi
>> > anonime senza alcun rapporto con la classe principale.
>> > C'e' una inner class creata implicitamente dalla lambda, ma quella
>> > finisce col ciclo.
>>
>> Le classi anonime sono inner class, e quindi hanno un riferimento alla
>> classe padre, piaccia o no
>> Quello che descrivi invece è una static inner class, che però non può
>> essere anonima
>>
>> Visto che la tupla dell'esempio di Simone non è utile a tornare dati,
>> cambio l'esempio usando una mappa e la sintassi delle doppie parentesi
>> graffe
>>
>> https://gist.github.com/ffissore/e4915691cc539b0954faf815609cdceb
>>
>> "...new HashMap() {..." è una inner class, anonima, e può accedere alla
>> classe genitore con la sintassi "Filter3.this."
>> Nel metodo "inspectInOtherMethod", l'instanza di Filter3 non è
>> raggiungibile, eppure la mappa restituita è in grado di accedere ai suoi
>> metodi.
>>
>> Se serve altra letteratura a proposito, Lukas Eder in questo post lo
>> spiega bene [1]. Si focalizza sulle doppie parentesi graffe, ma solo
>> perchè sono la sintassi più compatta per ottenere qualcosa di simile a
>> una Tupla in java. La sorgente del problema memory leak è l'aver tornato
>> un'istanza di una inner class
>>
>> [1]
>>
>> https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/
>>
>> NB: se nelle vostre codebase usate la sintassi delle doppie graffe,
>> buttatele e migrate o a "ImmutableMap.of" di Guava, o fatevi il vostro
>> metodo di utilità
>>
>> federico
>> 
>>
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-12-01 Thread Matteo Vaccari matteo.vacc...@gmail.com [it-torino-java-jug]
Spiegatemi questa cosa perché temo di non averla capita: se io creo una
classe anonima con new Object() {  }, la classe viene creata una volta
per tutte, indipendentemente dal numero di volte che il frammento di codice
viene eseguito?  Oppure viene creata una classe nuova ogni volta che lo
esegui?

Per come avevo capito io le classi anonime direi la prima.  Anzi ero
sicurissimo della prima.  Ma se e' cosi', non capisco dove sia il memory
leak.

On Sat, Dec 1, 2018 at 1:48 PM Federico Fissore feder...@fsfe.org
[it-torino-java-jug]  wrote:

>
>
> Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug] ha scritto il
> > In tutti i casi pero', anche se volessi restituire una collezione di
> > Object non c'e' memory leak comunque, non sono inner class ma classi
> > anonime senza alcun rapporto con la classe principale.
> > C'e' una inner class creata implicitamente dalla lambda, ma quella
> > finisce col ciclo.
>
> Le classi anonime sono inner class, e quindi hanno un riferimento alla
> classe padre, piaccia o no
> Quello che descrivi invece è una static inner class, che però non può
> essere anonima
>
> Visto che la tupla dell'esempio di Simone non è utile a tornare dati,
> cambio l'esempio usando una mappa e la sintassi delle doppie parentesi
> graffe
>
> https://gist.github.com/ffissore/e4915691cc539b0954faf815609cdceb
>
> "...new HashMap() {..." è una inner class, anonima, e può accedere alla
> classe genitore con la sintassi "Filter3.this."
> Nel metodo "inspectInOtherMethod", l'instanza di Filter3 non è
> raggiungibile, eppure la mappa restituita è in grado di accedere ai suoi
> metodi.
>
> Se serve altra letteratura a proposito, Lukas Eder in questo post lo
> spiega bene [1]. Si focalizza sulle doppie parentesi graffe, ma solo
> perchè sono la sintassi più compatta per ottenere qualcosa di simile a
> una Tupla in java. La sorgente del problema memory leak è l'aver tornato
> un'istanza di una inner class
>
> [1]
>
> https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/
>
> NB: se nelle vostre codebase usate la sintassi delle doppie graffe,
> buttatele e migrate o a "ImmutableMap.of" di Guava, o fatevi il vostro
> metodo di utilità
>
> federico
> 
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-30 Thread Federico Fissore feder...@fsfe.org [it-torino-java-jug]
Simone Bordet simone.bor...@gmail.com [it-torino-java-jug] ha scritto il 
30/11/18 alle 13:29:
> Ciao,
> 
> 
> On Fri, Nov 30, 2018 at 1:24 PM Federico Fissore feder...@fsfe.org
> [it-torino-java-jug]  wrote:
>>
>>
>>
>> Molto figo, ma attenzione ai memory leak
>>
>> Una Inner class tiene in automatico un riferimento alla classe che l'ha
>> creata.
> 
> Non mi risulta. Hai dei links?


Java Language Specification
https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.3
l'ultimo esempio

 > Here, every instance of WithDeepNesting.Nested.DeeplyNested has an
 > enclosing instance of class WithDeepNesting.Nested (its immediately
 > enclosing instance) and an enclosing instance of class WithDeepNesting
 > (its 2nd lexically enclosing instance).
> 

>> Tutto ok finchè il ciclo di vita della "tupla" è uguale o simile
>> a quello di quella classe; altrimenti è un memory leak da tenere sotto
>> controllo
> 
> Non credo, se no tutti gli usi di anonymous inner classes sarebbero
> "pericolosi".

Normalmente le inner class sono usate per "customizzare" il 
comportamento di qualche classe (ad esempio cosa fare quando un buttone 
di swing viene premuto), quindi il loro ciclo di vita non è più lungo 
delle classi dove vengono istanziate, e quindi il problema non si pone.

Ma se cominci a usarle per i dati, allora è facile che sopravvivano alla 
classe che le ha create

federico


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-30 Thread Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug]
dovrebbero essere tutti distrutti alla fine dello stream, no?

On Fri, 30 Nov 2018, 12:24 Federico Fissore feder...@fsfe.org
[it-torino-java-jug] 
>
> Molto figo, ma attenzione ai memory leak
>
> Una Inner class tiene in automatico un riferimento alla classe che l'ha
> creata. Tutto ok finchè il ciclo di vita della "tupla" è uguale o simile
> a quello di quella classe; altrimenti è un memory leak da tenere sotto
> controllo
>
> Federico
>
> Simone Bordet simone.bor...@gmail.com [it-torino-java-jug] ha scritto il
> 28/11/18 alle 21:15:
> > Ho appena letto la newsletter "Java Specialist" di Heinz Kabutz, dove
> > riporta che Henri Tremblay ha trovato un modo di usare le tuple negli
> > streams di Java 8:
> >
> > Arrays.asList("1", "22", "333").stream()
> > .map(v -> new Object() {
> > String value = v;
> > int length = v.length();
> > })
> > .filter(tuple -> tuple.length % 2 == 0)
> > .forEach(tuple -> System.out.println(tuple.value));
>
> 
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-30 Thread Simone Bordet simone.bor...@gmail.com [it-torino-java-jug]
Ciao,


On Fri, Nov 30, 2018 at 1:24 PM Federico Fissore feder...@fsfe.org
[it-torino-java-jug]  wrote:
>
>
>
> Molto figo, ma attenzione ai memory leak
>
> Una Inner class tiene in automatico un riferimento alla classe che l'ha
> creata.

Non mi risulta. Hai dei links?

> Tutto ok finchè il ciclo di vita della "tupla" è uguale o simile
> a quello di quella classe; altrimenti è un memory leak da tenere sotto
> controllo

Non credo, se no tutti gli usi di anonymous inner classes sarebbero
"pericolosi".

Secondo me viene creata la classe la prima volta, come dice Uberto,
legata al classloader, non alla enclosing class.

-- 
Simone Bordet
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless.   Victoria Livschitz


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-30 Thread Federico Fissore feder...@fsfe.org [it-torino-java-jug]
Molto figo, ma attenzione ai memory leak

Una Inner class tiene in automatico un riferimento alla classe che l'ha 
creata. Tutto ok finchè il ciclo di vita della "tupla" è uguale o simile 
a quello di quella classe; altrimenti è un memory leak da tenere sotto 
controllo

Federico

Simone Bordet simone.bor...@gmail.com [it-torino-java-jug] ha scritto il 
28/11/18 alle 21:15:
> Ho appena letto la newsletter "Java Specialist" di Heinz Kabutz, dove
> riporta che Henri Tremblay ha trovato un modo di usare le tuple negli
> streams di Java 8:
> 
> Arrays.asList("1", "22", "333").stream()
>  .map(v -> new Object() {
>  String value = v;
>  int length = v.length();
>  })
>  .filter(tuple -> tuple.length % 2 == 0)
>  .forEach(tuple -> System.out.println(tuple.value));




Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-29 Thread Riccardo Tasso riccardo.ta...@gmail.com [it-torino-java-jug]
Il giorno gio 29 nov 2018 alle ore 14:28 Uberto Barbini
uberto.g...@gmail.com [it-torino-java-jug] <
it-torino-java-jug@yahoogroups.com> ha scritto:

>
>
> La classe dovrebbe essere una sola, definita a compile time, quando la
> lambda viene "de-sugared"
>

Si ecco, era proprio questo che mi stavo chiedendo.

> 
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-29 Thread Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug]
Ho appena letto la stessa cosa.

Non ho (ancora) provato ma non mi ero mai reso conto che new Object(){}
effettivamente crea una nuova classe derivata.
Pensavo funzionasse solo con le interfacce.

Funziona da java8 immagino ma solo ora qualcuno lo ha scoperto? :)

Uberto

On Wed, 28 Nov 2018 at 20:42, Simone Bordet simone.bor...@gmail.com
[it-torino-java-jug]  wrote:

>
>
> Ho appena letto la newsletter "Java Specialist" di Heinz Kabutz, dove
> riporta che Henri Tremblay ha trovato un modo di usare le tuple negli
> streams di Java 8:
>
> Arrays.asList("1", "22", "333").stream()
> .map(v -> new Object() {
> String value = v;
> int length = v.length();
> })
> .filter(tuple -> tuple.length % 2 == 0)
> .forEach(tuple -> System.out.println(tuple.value));
>
> Notate come in map() viene creata una anonymous inner class di Object
> con 2 fields, "value" e "length", che può poi essere referenziata dopo
> in altri metodi di Stream.
>
> Funziona da Java 8 in avanti.
>
> Devo dire che sono impressionato!
>
> --
> Simone Bordet
> ---
> Finally, no matter how good the architecture and design are,
> to deliver bug-free software with optimal performance and reliability,
> the implementation technique must be flawless. Victoria Livschitz
> 
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-29 Thread Uberto Barbini uberto.g...@gmail.com [it-torino-java-jug]
La classe dovrebbe essere una sola, definita a compile time, quando la
lambda viene "de-sugared"

Uberto

On Thu, 29 Nov 2018 at 09:04, Riccardo Tasso riccardo.ta...@gmail.com
[it-torino-java-jug]  wrote:

>
>
> Sicuramente è un bel trick, ma non è costoso creare una inner class per
> ogni elemento dello stream?
>
> Il giorno mer 28 nov 2018, 21:42 Simone Bordet simone.bor...@gmail.com
> [it-torino-java-jug]  ha scritto:
>
>>
>>
>> Ho appena letto la newsletter "Java Specialist" di Heinz Kabutz, dove
>> riporta che Henri Tremblay ha trovato un modo di usare le tuple negli
>> streams di Java 8:
>>
>> Arrays.asList("1", "22", "333").stream()
>> .map(v -> new Object() {
>> String value = v;
>> int length = v.length();
>> })
>> .filter(tuple -> tuple.length % 2 == 0)
>> .forEach(tuple -> System.out.println(tuple.value));
>>
>> Notate come in map() viene creata una anonymous inner class di Object
>> con 2 fields, "value" e "length", che può poi essere referenziata dopo
>> in altri metodi di Stream.
>>
>> Funziona da Java 8 in avanti.
>>
>> Devo dire che sono impressionato!
>>
>> --
>> Simone Bordet
>> ---
>> Finally, no matter how good the architecture and design are,
>> to deliver bug-free software with optimal performance and reliability,
>> the implementation technique must be flawless. Victoria Livschitz
>>
> 
>


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-29 Thread Simone Bordet simone.bor...@gmail.com [it-torino-java-jug]
Ciao,

On Thu, Nov 29, 2018 at 10:04 AM Riccardo Tasso
riccardo.ta...@gmail.com [it-torino-java-jug]
 wrote:
> Sicuramente è un bel trick, ma non è costoso creare una inner class per ogni 
> elemento dello stream?

Se ti serve una tupla, allocheresti comunque una classe Pair o Tuple
per portare avanti nello stream più di un valore, come nell'esempio.

-- 
Simone Bordet
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless.   Victoria Livschitz


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-29 Thread Roberto Franchini ro.franch...@gmail.com [it-torino-java-jug]
On Thu, Nov 29, 2018 at 10:04 AM Riccardo Tasso riccardo.ta...@gmail.com
[it-torino-java-jug]  wrote:

>
>
> Sicuramente è un bel trick, ma non è costoso creare una inner class per
> ogni elemento dello stream?
>

 Per l'esempio si'.
Per un caso reale, in cui probabilmente mapperesti lo stream su qualche
oggeto di dominio, o alla peggio una mappa ( :) ), un oggetto vale l'altro
e la tupla potrebbe fare al caso tuo.
La trovo elegante perche' :
- e' tipizzata
- i nomi di campo sono espliciti (no element1, element2...)
- ha un numero di campi elevato a piacere: se non ricordo male, tutte le
implementazioni di tuple hanno un numero di campi limitato (sparo, potrei
aver scritto una immane cazzata)



-- 
Roberto Franchini
"The impossible is inevitable"
https://github.com/robfrank/
https://twitter.com/robfrankie
https://www.linkedin.com/in/robfrank


Re: [Jug-Torino] Tuples in Java 8 streams

2018-11-29 Thread Riccardo Tasso riccardo.ta...@gmail.com [it-torino-java-jug]
Sicuramente è un bel trick, ma non è costoso creare una inner class per
ogni elemento dello stream?

Il giorno mer 28 nov 2018, 21:42 Simone Bordet simone.bor...@gmail.com
[it-torino-java-jug]  ha scritto:

>
>
> Ho appena letto la newsletter "Java Specialist" di Heinz Kabutz, dove
> riporta che Henri Tremblay ha trovato un modo di usare le tuple negli
> streams di Java 8:
>
> Arrays.asList("1", "22", "333").stream()
> .map(v -> new Object() {
> String value = v;
> int length = v.length();
> })
> .filter(tuple -> tuple.length % 2 == 0)
> .forEach(tuple -> System.out.println(tuple.value));
>
> Notate come in map() viene creata una anonymous inner class di Object
> con 2 fields, "value" e "length", che può poi essere referenziata dopo
> in altri metodi di Stream.
>
> Funziona da Java 8 in avanti.
>
> Devo dire che sono impressionato!
>
> --
> Simone Bordet
> ---
> Finally, no matter how good the architecture and design are,
> to deliver bug-free software with optimal performance and reliability,
> the implementation technique must be flawless. Victoria Livschitz
> 
>


[Jug-Torino] Tuples in Java 8 streams

2018-11-28 Thread Simone Bordet simone.bor...@gmail.com [it-torino-java-jug]
Ho appena letto la newsletter "Java Specialist" di Heinz Kabutz, dove
riporta che Henri Tremblay ha trovato un modo di usare le tuple negli
streams di Java 8:

Arrays.asList("1", "22", "333").stream()
.map(v -> new Object() {
String value = v;
int length = v.length();
})
.filter(tuple -> tuple.length % 2 == 0)
.forEach(tuple -> System.out.println(tuple.value));

Notate come in map() viene creata una anonymous inner class di Object
con 2 fields, "value" e "length", che può poi essere referenziata dopo
in altri metodi di Stream.

Funziona da Java 8 in avanti.

Devo dire che sono impressionato!

-- 
Simone Bordet
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless.   Victoria Livschitz