2016-02-03 5 views
17

Я пытаюсь использовать вместо битовой маски Ниже приведен кодjava.util.stream.Collectors с EnumSet Потока

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

Я хотел бы вернуться EnumSet вместо обычного набора (не хочу терять на полезность EnumSet только из-за кастинга).

Нужно определить, как создать пользовательский сборщик для сбора EnumSet.

ответ

32

Вы можете использовать toCollection(Supplier):

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

Метод toCollection получает лямбда, который должен создать пустую коллекцию для хранения результата. Здесь мы создаем пустой EnumSet с использованием вызова EnumSet.noneOf. Обратите внимание, что для EnumSet вы должны всегда указывать (неявно или явно), для чего это перечисление установлено.

+0

Спасибо большое, было бы очень полезно, если бы вы могли кратко объяснить эту лямбду '() -> EnumSet.noneOf (Amenities.class)', как это создает Поставщик, который может автоматически вызывать 'EnumSet.add()' –

+1

@SomasundaramSekar, добавлено некоторое объяснение. Надеюсь, это поможет. –

+3

Обратите внимание на альтернативу 'EnumSet s = EnumSet.copyOf (ALL_OPTS); s.removeIf (a -> (a.ameityId & bitFlag) <= 0); '... – Holger

 Смежные вопросы

  • Нет связанных вопросов^_^