Estoy usando Java Lambda para ordenar una lista.
¿Cómo puedo ordenarlo de forma inversa?
Vi esta publicación , pero quiero usar java 8 lambda.
Aquí está mi código (usé * -1) como un hack
Arrays.asList(files).stream()
.filter(file -> isNameLikeBaseLine(file, baseLineFile.getName()))
.sorted(new Comparator<File>() {
public int compare(File o1, File o2) {
int answer;
if (o1.lastModified() == o2.lastModified()) {
answer = 0;
} else if (o1.lastModified() > o2.lastModified()) {
answer = 1;
} else {
answer = -1;
}
return -1 * answer;
}
})
.skip(numOfNewestToLeave)
.forEach(item -> item.delete());
java
lambda
java-8
java-stream
Elad Benda2
fuente
fuente
-1 * answer
conanswer
, el orden cambiará a reverso de lo que era-1 * ...
.forEachOrdered
lugar deforEach
forEachOrdered
como su nombre indica, se preocupa por fin encuentro que es relevante ya que desea omitir un cierto número de nuevos archivos que se basa en la “ordenados por fecha de modificación” fin .sort
→skip
→ (sin ordenar)forEach
, es correcta y que de hecho se implementa para funcionar de esta manera en los JRE de hoy, pero en 2015, cuando se hicieron los comentarios anteriores, fue de hecho un problema (como puede leer en esta pregunta ).Respuestas:
Puede adaptar la solución que vinculó en Cómo ordenar ArrayList <Long> en Java en orden decreciente? envolviéndolo en una lambda:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
tenga en cuenta que f2 es el primer argumento de
Long.compare
, no el segundo, por lo que el resultado se revertirá.fuente
Comparator.comparingLong(File::lastModified).reversed()
comparingLong(v->Long.valueOf(v)).reversed()
lanza error de compilación:java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)
. ¿Por qué?comparingLong(Long::valueOf).reversed()
lugar. OCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
T
lugar deObject
, lo que significa que el tipo de objeto no debería perderse. Pero en realidad lo es. Eso es lo que me confunde.comparingLong(Long::valueOf).reversed()
, funciona, asimismo, una expresión lambda de tipo explícito trabajoscomparingLong((String v) -> Long.valueOf(v)).reversed()
trabajos TambiénStream.of("foo").mapToInt(s->s.length()).sum()
funciona, ya que"foo"
proporciona el tipo independiente, mientras queStream.of().mapToInt(s-> s.length()).sum()
falla.Si sus elementos de secuencia se implementan
Comparable
, la solución se vuelve más simple:fuente
...stream().max(Comparator.naturalOrder())
.stream().max(Comparator.comparing(Clazz::getDate))
Comparable
?Collections.reverse
no tiene tal restricción.Utilizar
Luego
fuente
Puede usar una referencia de método:
Como alternativa a la referencia de método, puede usar una expresión lambda, por lo que el argumento de comparación se convierte en:
fuente
Forma alternativa de compartir:
ASC
DESC
fuente
Esto se puede hacer fácilmente utilizando Java 8 y el uso de un comparador invertido .
He creado una lista de archivos a partir de un directorio, que visualizo sin clasificar, ordenados y ordenados inversamente usando un Comparador simple para la clasificación y luego invocando invertido () para obtener la versión inversa de ese Comparador.
Ver código a continuación:
fuente
Ordenar la lista de archivos con java 8 Collections
Ejemplo de cómo usar Colecciones y Comparator Java 8 para ordenar una lista de archivos.
fuente
En simple, utilizando Comparador y la colección se puede ordenar como a continuación en la inversión para el uso de Java 8
fuente
Para la clasificación inversa, simplemente cambie el orden de x1, x2 para llamar al método x1.compareTo (x2), el resultado será inverso entre sí
Orden predeterminada
Orden inverso
fuente