Вот что делает компилятор Microsoft при компиляции разделов небольшими интегральными константами. Предположим, что 32-разрядная машина (код может быть соответствующим образом скорректирован):
int32_t div10(int32_t dividend)
{
int64_t invDivisor = 0x1999999A;
return (int32_t) ((invDivisor * dividend) >> 32);
}
. Что здесь происходит, мы умножаемся на близкое приближение 1/10 * 2 ^ 32 и затем удаляем 2 ^ 32. Этот подход может быть адаптирован к различным делителям и различным битовым ширинам.
Это отлично подходит для архитектуры ia32, так как его команда IMUL поместит 64-разрядный продукт в edx: eax, а значение edx будет требуемое значение. Viz (при условии, что дивиденд передается в eax, а фактор возвращается в eax)
div10 proc
mov edx,1999999Ah ; load 1/10 * 2^32
imul eax ; edx:eax = dividend / 10 * 2 ^32
mov eax,edx ; eax = dividend / 10
ret
endp
Даже на машине с инструкцией с медленным умножением это будет быстрее, чем различие в программном обеспечении.
flatMap()
и вложения - путь. Попробуйте это:
topLevelStream() //create a stream of top level elements
.flatMap( top -> top.streamMid() //create a stream of mid level elements
.flatMap( mid -> mid.streamLow() //create a stream of low level elements
.map(low -> "use top, mid and low here")
)
)
.collect( ... );
Благодаря такому вложению у вас все еще есть доступ к элементам во внешних функциях, а комбинация flatMap()
и map()
открывает поток, который map()
вызывается для [ 115].
Вы можете просто использовать flatMap
как:
List<SomeObj> objs = topLevel.getMidLevels().stream()
.flatMap(a -> a.getLowLevels().stream().map(b -> topBuilder.apply(a).apply(b)))
.collect(Collectors.toList());
со своими сущностями, аналогичными:
class TopLevel {
List<MidLevel> midLevels;
}
class MidLevel {
List<LowLevel> lowLevels;
}
class LowLevel {
}
class SomeObj {
}