2016-02-03 15 views
17

Sto cercando di usare al posto della maschera di bit sotto è il codicejava.util.stream.Collectors con EnumSet flusso

public static Set<Amenities> fromBitFlags(int bitFlag) { 
    return ALL_OPTS.stream().filter(a -> (a.ameityId & bitFlag) > 0).collect(Collectors.toSet()); 
} 

Vorrei tornare EnumSet invece di un set normale (non voglio perdere sull'utilità di EnumSet solo per il casting).

Sono necessarie alcune istruzioni su come creare un servizio di raccolta personalizzato per raccogliere EnumSet.

risposta

32

È possibile utilizzare toCollection(Supplier):

return ALL_OPTS.stream().filter(a -> (a.ameityId & bitFlag) > 0) 
       .collect(Collectors.toCollection(() -> EnumSet.noneOf(Amenities.class))); 

Il metodo toCollection riceve una lambda che dovrebbe creare un insieme vuoto per memorizzare il risultato. Qui creiamo vuoto EnumSet utilizzando la chiamata EnumSet.noneOf. Nota che per EnumSet devi sempre specificare (implicitamente o esplicitamente) a quale enumerazione è impostata questa impostazione.

+0

Grazie mille, sarebbe davvero utile se si potesse spiegare questo lambda in breve '() -> EnumSet.noneOf (Amenities.class)', come questo crea un Fornitore che può chiamare automaticamente 'EnumSet.add()' –

+1

@SomasundaramSekar, aggiunto qualche spiegazione. Speriamo che questo aiuti. –

+3

Considera l'alternativa di 'EnumSet s = EnumSet.copyOf (ALL_OPTS); s.removeIf (a -> (a.ameityId e bitFlag) <= 0); '... – Holger

Problemi correlati