Aplicar la reducción sólo si se cumple cierta condición

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) {
        //...
    }
    //...
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=177850&siteId=1
Recomendado
Clasificación