Java потоковая функция высшего порядка

Вот что делает компилятор 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

Даже на машине с инструкцией с медленным умножением это будет быстрее, чем различие в программном обеспечении.

4
задан wearebob 18 March 2019 в 16:32
поделиться

2 ответа

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].

0
ответ дан Thomas 18 March 2019 в 16:32
поделиться

Вы можете просто использовать 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 {
}
0
ответ дан Naman 18 March 2019 в 16:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: