2012-02-24 14 views
5

Por ejemplo, quiero filtrar objetos por algunos valores de campo. Puedo escribir¿Hay alguna forma de crear constantes de nivel de método sin contaminación del espacio de nombres?

objects.filter{ o => 
    val set = Set(c1,c2) 
    set contains o.field 
} 

en ese caso voy a crear hashset cada método llamado tiempo ==> será lento

también puedo escribir de esta manera

val set = Set(c1,c2) 
objects.filter{ o => 
    set contains o.field 
} 

Se trabajará rápido pero contaminé mi espacio con el objeto sin sentido set.

¿Cuál es la mejor manera de hacerlo?

Respuesta

12

Esto parece funcionar:

objects.filter { 
    val set = Set(c1,c2) 
    o => set contains o.field 
} 

Si va a factorizar "Set (c1, c2)" en una definición así:

def getSet = { println("Set!"); Set(5,7)} 

se vería que sólo hay una establecer creado.

7

Solo tiene que poner llaves alrededor, y el espacio de nombres ya no está contaminado.

{ 
    val set = Set(c1,c2) 
    objects.filter{ o => 
    set contains o.field 
    } 
} 
7

Utilice funciones internas con nombre, ayudan a estructurar mejor el código y mantener el espacio de nombres limpio.

def someMeaningfulName = { 
    val set = Set(c1,c2) 
    objects.filter{ o => 
    set contains o.field 
    } 
} 
Cuestiones relacionadas