Estou usando o java lambda para classificar uma lista.
como posso classificá-lo de maneira inversa?
Eu vi esse post , mas quero usar o java 8 lambda.
Aqui está o meu código (eu usei * -1) como um 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
fonte
fonte
-1 * answer
poranswer
, o pedido mudará para o reverso do que era-1 * ...
.forEachOrdered
vez deforEach
forEachOrdered
como o nome sugere, preocupações sobre a ordem encontro que é relevante como você quiser pular um certo número de mais novos arquivos que conta com a “classificado por data de modificação” fim .sort
→skip
→ (não ordenado)forEach
deve funcionar está correto e que de fato foi implementado para funcionar dessa maneira nos JREs de hoje, mas em 2015, quando os comentários anteriores foram feitos, foi realmente um problema (como você pode ler nesta pergunta ).Respostas:
Você pode adaptar a solução que você vinculou em Como classificar ArrayList <Long> em Java em ordem decrescente? envolvendo-o em uma lambda:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
observe que f2 é o primeiro argumento de
Long.compare
, não o segundo, portanto o resultado será revertido.fonte
Comparator.comparingLong(File::lastModified).reversed()
comparingLong(v->Long.valueOf(v)).reversed()
lança compilação de erro:java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)
. Por quê?comparingLong(Long::valueOf).reversed()
. OuCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
T
vez deObject
, o que significa que o tipo de objeto não deve ser perdido. Mas na verdade é. É disso que estou confuso.comparingLong(Long::valueOf).reversed()
, funciona, da mesma forma uma expressão lambda de tipo explícito funcionacomparingLong((String v) -> Long.valueOf(v)).reversed()
funciona. TambémStream.of("foo").mapToInt(s->s.length()).sum()
funciona, pois"foo"
fornece o tipo independente enquantoStream.of().mapToInt(s-> s.length()).sum()
falha.Se seus elementos de fluxo implementarem
Comparable
, a solução se tornará mais simples:fonte
...stream().max(Comparator.naturalOrder())
.stream().max(Comparator.comparing(Clazz::getDate))
Comparable
.Collections.reverse
não possui essa restrição.Usar
Então
fonte
Você pode usar uma referência de método:
Em alternativa à referência do método, você pode usar uma expressão lambda, portanto, o argumento da comparação se torna:
fonte
Compartilhamento de maneira alternativa:
ASC
DESC
fonte
Isso pode ser feito facilmente usando o Java 8 e o uso de um comparador reverso .
Criei uma lista de arquivos a partir de um diretório, que exibi sem classificação, classificação e classificação reversa usando um comparador simples para a classificação e, em seguida, chamando reversed () para obter a versão reversa desse comparador.
Veja o código abaixo:
fonte
Classificar lista de arquivos com java 8 Collections
Exemplo de como usar o Java 8 do Collections and Comparator para classificar uma lista de arquivos.
fonte
Em simples, usando Comparador e Cobrança você pode classificar como abaixo na reversão fim usando JAVA 8
fonte
Para classificação inversa, basta alterar a ordem de x1, x2 para chamar o método x1.compareTo (x2), o resultado será inverso entre si.
Pedido padrão
Ordem reversa
fonte