2016-02-03 36 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.noneOf調用創建空的EnumSet。請注意,對於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