2016-02-03 11 views
17

Próbuję użyć zamiast maskę bitową Poniżej znajduje się kodjava.util.stream.Collectors z EnumSet Stream

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

Chciałbym wrócić EnumSet zamiast zwykłego zestawu (Nie chcę stracić na użyteczność EnumSet tylko z powodu rzucania).

Potrzebujesz wskazówek, jak utworzyć niestandardowy kolektor do zbierania EnumSet.

Odpowiedz

32

Można użyć toCollection(Supplier):

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

Sposób toCollection otrzyma lambda, która powinna utworzyć pustą kolekcję aby zapisać wynik. Tutaj tworzymy puste EnumSet używając połączenia EnumSet.noneOf. Zauważ, że dla EnumSet musisz zawsze podać (niejawnie lub jawnie), dla którego wyliczenia jest to ustawione.

+0

Wielkie dzięki, byłoby naprawdę pomocne, gdyby można było wyjaśnić tę lambdę w skrócie '() -> EnumSet.noneOf (Amenities.class)', w jaki sposób tworzy się dostawcę, który może automatycznie wywołać 'EnumSet.add()' –

+1

@SomasundaramSekar, dodano pewne wyjaśnienie. Mam nadzieję, że to pomaga. –

+3

Zastanów się nad alternatywą 'EnumSet s = EnumSet.copyOf (ALL_OPTS); s.removeIf (a -> (a.ameityId & bitFlag) <= 0); '... – Holger