Calcular el porcentaje de una corriente de valor utilizando

Natalie_eds:

Estoy tratando de encontrar la manera de calcular el porcentaje de un valor específico en una lista cuando se utiliza stream.

Mi objeto getTagpuede tener valor Go Yy quiero calcular el porcentaje de G:sla lista. El otro objeto es getDateTimeque es de la forma 1946-01-12.

Tengo la condición filter(weather -> !weather.getDateTime().isAfter(dateTo) && !weather.getDateTime().isBefore(dateFrom))porque yo sólo quiero el porcentaje entre dos fechas que son la entrada del usuario.

Así que cada valor DateTime corresponde a cualquiera Go Y. He utilizado Collectors.counting()para calcular la frecuencia de ambos Gy Y, pero ¿cómo puedo obtener el porcentaje?

Map<String, Long> percentage = weatherData.stream()
        .filter(weather -> !weather.getDateTime().isAfter(dateTo) && !weather.getDateTime().isBefore(dateFrom))
        .collect(Collectors.groupingBy(Weather::getTag, Collectors.counting()));
Erickson:

Si asigna el elemento que se preocupan por ( "G") a 1, y todo lo demás a 0, el valor promedio es el porcentaje de "G" en la corriente.

double pctG = list.stream()
    .mapToInt(obj -> obj.getTag().equals("G") ? 1 : 0)
    .summaryStatistics()
    .getAverage();

Si realmente desea particionar el mapa en "G" y cubos "Y" como se muestra en la cuestión, utilizar collectingAndThen()para modificar el resultado aguas abajo. He aquí un método de propósito general para crear una Collectorpara que:

static <T> Collector<T, ?, Double> scaling(long factor) {
    return Collectors.collectingAndThen(
        Collectors.counting(), count -> (double) count / factor);
}

Utilizar de esta manera:

Map<String, Double> fractions = weatherData.stream()
        .filter(...)
        .collect(
            Collectors.groupingBy(Weather::getTag, scaling(weatherData.size())));

Supongo que te gusta

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