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 timestamp
yString bookType
El planteamiento del problema es - Quiero encontrar el recuento del número de objetos en la lista dada, que tienen el mismo bookType
como el que tiene marca de tiempo más bajo.
Por ejemplo, si la lista tipo determinado de objetos basado en timestamp
en orden ascendente, y el primer objeto en la lista ordenada tiene bookType
campo 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 timestamp
y la correspondiente bookType
amd 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
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 min
el 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 min
el valor y volver es bookType
a continuación recogida de corriente y el grupo por bookType
y 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();
}