alexpfx:
¿Hay una manera de dejar que la 'reducción' del método de reducir () Corriente de ser opcional?
Quiero iterar sobre una lista de Períodos y unirse a los períodos que se superponen y mantener ambos períodos si no se superponen:
interface Period {
boolean overlaps(Period other);
}
List<Period> periods = new ArrayList<>();
periods.stream().reduce(new BinaryOperator<Period>() {
@Override
public Period apply(Period period, Period period2) {
if (period.overlaps(period2)){
// join period and period2 into period.
}else{
"return both"
// don't reduce and maintain period and period2 in the list.
}
return null;
}
});
shmosel:
No creo que se puede hacer fácilmente con corrientes solo. Con guayaba oscila , puede hacer algo como esto:
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());
Esto supone una estructura de clases como la siguiente, pero se puede ajustar según sea necesario:
interface Period {
int getStart();
int getEnd();
}
class PeriodImpl implements Period {
PeriodImpl(int start, int end) {
//...
}
//...
}