Java 8: escribir de manera funcional a ordenar, filtrar y contar al mismo tiempo

Dipmcng:

Soy bastante nuevo en Java, y estoy tratando de escribir la lógica continuación en forma funcional.

Tengo una lista de objetos, que tienen muchos campos. List<someObject>Los campos de interés, por ahora son long timestampyString bookType

El planteamiento del problema es - Quiero encontrar el recuento del número de objetos en la lista dada, que tienen el mismo bookTypecomo el que tiene marca de tiempo más bajo.

Por ejemplo, si la lista tipo determinado de objetos basado en timestampen orden ascendente, y el primer objeto en la lista ordenada tiene bookTypecampo como SOMETYPE; entonces quiero saber cuántos objetos hay en la lista con elbookType SOMETYPE

He escrito esta lógica utilizando la forma no funcional simple y llano, por maintaing 2 variables temporales y luego iterar sobre la lista una vez para encontrar la más baja timestampy la correspondiente bookTypeamd un recuento de cadabookType

Pero esto no es aceptable para ser ejecutado en un lambda, ya que requiere de variables para ser final

Sólo pude escribir la parte donde podría ordenar la lista dada sobre la base de timestamp

n.stream().sorted(Comparator.comparingLong(someObject::timestamp)).collect(Collectors.toList());

Estoy atascado cómo proceder con encontrar el recuento de los más bajos timestamp bookType

m.antkowicz:

Pero esto no es aceptable para ser ejecutado en un lambda, ya que requiere las variables a ser definitiva

En primer lugar - esto no es un problema ya que se puede hacer que la variable de eficacia definitiva mediante la creación, por ejemplo. matriz de entrada única y pasar su única (primera) objeto a la lambda

Lo segundo es que hay básicamente no tiene sentido para poner todo en un solo lambda - pensar en esto, lógicamente cómo encontrar minel valor está conectado con el conteo de objetos agrupados por algún atributo? No es - Poner esto (de alguna manera) a un flujo de sólo va a ofuscar su código

Lo que debe hacer - usted debe prepararse método para encontrar minel valor y volver es bookTypea continuación recogida de corriente y el grupo por bookTypey tamaño retorno de la colección con determinado valor de la clave

Podría vería en este scratch:

public class Item {
    private final long timestamp;
    private final String bookType;

    // Constructors, getters etc
}

// ...

public int getSizeOfBookTypeByMinTimestamp() {
    return items.stream()
        .collect(Collectors.groupingBy(Item::getBookType))
        .get(getMin(items))
        .size();
}

private String getMin(List<Item> items) {
    return items
        .stream()
        .min(Comparator.comparingLong(Item::getTimestamp))
        .orElse( /* HANDLE NO OBJECT */ ) // you can use also orElseThrow etc
        .getBookType();
}

Supongo que te gusta

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