On Fri, 30 Nov 2018 at 21:46, Federico Fissore [email protected] [it-torino-java-jug] <[email protected]> wrote:
> > > Uberto Barbini [email protected] [it-torino-java-jug] ha scritto il > 30/11/18 alle 13:51: > > > > > > dovrebbero essere tutti distrutti alla fine dello stream, no? > > > > Volevo risponderti che, sì, nell'esempio di Simone vengono distrutte > perchè lo stream di tuple viene consumato, invece che restituito, e che > se invece lo riscrivi così > > public Stream<? extends Object> tuples() { > return Arrays.asList("1", "22", "333").stream() > .map(v -> new Object() { > String value = v; > int length = v.length(); > }) > .filter(tuple -> tuple.length % 2 == 0); > } > > hai un memory leak. > > Però poi ho provato a usarlo ed totalmente inutile: ovviamente non puoi > accedere ai campi "value" e "length" da fuori. A meno di reflection o di > definire un tipo con quei membri, e allora addio al vantaggio sintattico. > > Quindi tolgo il "molto" dal "molto figo". E' un caso buono solo per casi > come quello dell'esempio > E' una tecnica buona per casi in cui le tuple siano una fase intermedia della catena delle map, tutto sommato resta abbastanza utile. 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. Uberto > > federico > >
