Я не думаю, что вы можете легко сделать это с помощью одних потоков.С диапазонами гуавы вы можете сделать что-то вроде этого:
periods.stream()
.map(p -> Range.closedOpen(p.getStart(), p.getEnd()))
.collect(TreeRangeSet::<Integer>create, RangeSet::add, RangeSet::addAll)
.asRanges()
.stream()
.map(r -> new PeriodImpl(r.lowerEndpoint(), r.upperEndpoint()))
.collect(Collectors.toList());
Это предполагает структуру класса, подобную приведенной ниже, но вы можете изменить ее при необходимости:
interface Period {
int getStart();
int getEnd();
}
class PeriodImpl implements Period {
PeriodImpl(int start, int end) {
//...
}
//...
}