Select enum constants from boolean[] or bit mask#44
Select enum constants from boolean[] or bit mask#44runeflobakk wants to merge 5 commits intomainfrom
Conversation
ddcd566 to
0a7477e
Compare
| if (candidates.length == 0) { | ||
| return Stream.empty(); | ||
| } | ||
| return mask.get(0, candidates.length).stream().mapToObj(selectedOrdinal -> candidates[selectedOrdinal]); |
There was a problem hiding this comment.
Jeg skjønner åpenbart ikke hvordan dette virker… vil ikke selectedOrdnial alltid bare være 0 eller 1?
There was a problem hiding this comment.
Ja, den er sneaky 😅
Et BitSet er ikke en Collection (eller java.util.Set), det er en helt standalone struktur for å behandle bit-sekvenser.
BitSet.stream() gir ikke hvert av elementene i bit-sekvensen, altså en strøm med 0-er og 1-ere og som typisk ville vært ekvivalent til å kalle .stream() på en collection, men (hold deg fast) indeksene til de bit-ene som er satt, altså hvilke bits som er 1. Dette gir altså en strøm-linjeformet (høhø) tilgang til hvilke bits som er "påskrudd", fremfor å selv traversere alle bits, holde styr på hvilke posisjon man er på og sjekke 0 vs. 1 etc.
Edit: Det som kanskje ikke er åpenbart her heller, er at BitSet.get(0, candidates.length) gir et nytt BitSet, og ikke en collection hvor man får det antallet første bits man spesifiserer, også kaller .stream() på en sånn collection.
There was a problem hiding this comment.
BitSet.stream() gir ikke hvert av elementene i bit-sekvensen, altså en strøm med 0-er og 1-ere […], men […] indeksene til de bit-ene som er satt, altså hvilke bits som er 1.
Da gir det straks mer mening! 💡
Only log warns, and use System.out (not slf4j-simple's default System.err)
Grouping into nested test classes
0a7477e to
5d337c0
Compare
A BitSet constructed from a long is interpreted little endian, i.e. the bits of a long is traversed "from right-to-left".
ef33d0e to
cd52ab5
Compare
Use a bit mask to select constants from an enum, based on which indices which are set (1-bits):
Use an array of booleans to select constants from an enum, based on which indices which are
true;Use case
This is obviously a bit esoteric functionality. The intention is to ease the use of some APIs which may (probably for valid performance reasons, at least at the time the APIs were defined) return a kind of bitmask to represent a standardized set of possibly set or unset values.
An example of this is X509Certificate.getKeyUsage(), which returns an array of booleans, where each element's position in the array indicate if a known set of ordered values is
trueorfalse. This will enable e.g. the following:Note on EnumSet
Java already has a way to represent a set of enum constants using a compact and efficient bitmask, but no way to construct the EnumSet using a bitmask as the source.