2011-03-06 15 views

Respuesta

58

Aplica una operación a una colección y realiza un seguimiento de un valor intermedio. Tome este ejemplo: [1, 2, 3, 4].inject(0, { sum, value -> sum + value }). Esto dice que use 0 como el valor inicial y aplique la operación de suma al resultado intermedio y a cada elemento en secuencia. Cada aplicación de la operación genera un nuevo resultado intermedio. En este caso, el cierre suma los números, por lo que genera la suma de la lista. Se puede imaginar que le gusta:

<initial value> <operation> <element1> <operation> ... <elementn> 

O, en el caso de [1, 2, 3, 4].inject(0, { sum, value -> sum + value }):

0 + 1 + 2 + 3 + 4 

para encontrar el producto de una lista, puede utilizar [1, 2, 3, 4].inject(1, { product, value -> product * value}). En este caso, 1 se usa como valor inicial, ya que es el valor de identidad para la multiplicidad.

Aquí hay un ejemplo que divide una lista de cadenas de varias palabras en una lista plana de las palabras:

strings = ["", "this", "is a", "test of inject!"] 
words = strings.inject([], { list, value -> list + value.tokenize() }) 
assert words == ["this", "is", "a", "test", "of", "inject!"] 

Otros términos que se utilizan a veces para describir esta operación son "reducir", como en MapReduce, o un "pliegue" (específicamente un foldl).

+0

¿podría decir en el ejemplo, qué hace tokenize? –

+0

Tokenize solo divide una cadena en espacios en blanco. Es lo mismo que String.split, excepto que devuelve una lista en lugar de una matriz. – ataylor

+3

Una elección muy extraña del nombre del método. Me pregunto por qué no se denominó reducir o plegar. –

Cuestiones relacionadas