Dal momento mi sento come un principiante (rispetto al DPP e Amber) potrei spiegare a un principiante in una lingua principianti :
Innanzitutto, la funzione anonima (o espressione di codice/espressione lambda) è semplicemente una funzione che non ha un nome. Potrebbe essere legato a una variabile come questa.
scala> val foo = (x: Int) => 2*x
foo: (Int) => Int = <function1>
scala> val bar = foo
bar: (Int) => Int = <function1>
scala> bar(5)
res2: Int = 10
Vedete, la funzione non ha il nome foo, potrebbe invece essere chiamata dalla barra.
In secondo luogo, una chiusura è una funzione anonima che ha una variabile che non è definita all'interno della funzione (la variabile/valore deve essere stata dichiarata prima che la funzione sia definita). Il termine "chiusura a pieno carico" potrebbe riferirsi a questa funzionalità.
scala> var constant = 7
constant: Int = 7
scala> val foo = (x: Int) => 2*x + constant
foo: (Int) => Int = <function1>
scala> foo(5)
res3: Int = 17
scala> constant = 6
constant: Int = 6
scala> foo(5)
res4: Int = 16
La prima volta che vedi questo, potresti chiederti a cosa serva. In breve, ha molti settori di applicazione :-)
fonte
2010-07-17 18:40:30
Questo è esattamente quello che stavo cercando. Grazie mille! – northpole
@Jesper: No, non funzionerebbe se avessi fatto x final. Mi piacerebbe solo avere un messaggio di errore diverso. ;) Potrei rendere x un array int finale con un solo elemento ... –
@Jesper, le modifiche apportate ai contenuti dell'array 'final' all'interno di' Runnable' saranno visibili in ogni ambito in cui l'array è visibile. –