Maison  >  Article  >  Liste des tableaux de streaming Java et comparaison avec l'enregistrement précédent

Liste des tableaux de streaming Java et comparaison avec l'enregistrement précédent

WBOY
WBOYavant
2024-02-22 14:00:10632parcourir

L'éditeur php Yuzai vous propose ce numéro de questions-réponses Java, expliquant comment utiliser le streaming pour traiter les listes de tableaux en Java et les comparer avec les enregistrements précédents. Grâce à cet article, vous apprendrez à utiliser les capacités de streaming de Java pour opérer efficacement sur des listes de tableaux et les comparer avec les enregistrements précédents. Approfondissons ce sujet et améliorons votre compréhension et vos compétences en programmation Java.

Contenu de la question

J'ai une classe d'enregistrement simple qui contient un identifiant et une valeur int. Plusieurs éléments d'enregistrement "triés" sont stockés dans une liste.

Je souhaite parcourir une liste, comparer l'élément actuel avec l'élément précédent et trouver la différence entre leurs valeurs.

Code :

import java.util.*;  

class RecordA{
    Integer id;
    Integer value;
    
    RecordA(Integer id, Integer value) {
        this.id = id;
        this.value = value;
    }
    
    Integer getId() { return id;}
    Integer getValue() { return value;}
}

class RecordB {
    Integer id;
    Integer value;
    Integer diff;
    
    RecordB(Integer id, Integer value, Integer diff) {
        this.id = id;
        this.value = value;
        this.diff = diff;
    }
    
    Integer getId() { return id;}
    Integer getValue() { return value;}
    Integer getDiff() { return diff;}
}

class HelloWorld {
    public static void main(String[] args) {
        
        
        List<RecordA> listA = new ArrayList<>();
        RecordA recordA1 = new RecordA(1,10);
        listA.add(recordA1);
        RecordA recordA2 = new RecordA(2,15);
        listA.add(recordA2);
        RecordA recordA3 = new RecordA(3,25);
        listA.add(recordA3);
        RecordA recordA4 = new RecordA(4,30);
        listA.add(recordA4);
        
        System.out.println(listA.size());
    }
}

Je souhaite comparer l'enregistrementa.value actuel avec l'enregistrementa.value précédent en utilisant un flux (si possible), en mappant le résultat dans un enregistrementb avec le même identifiant et la même valeur, mais en stockant l'enregistrement actuel-précédent.

Enfin, la liste des enregistrements contiendra

  • 1, 10, 0 //(10-0)
  • 2, 15, 5 //(15-10)
  • 3, 25, 10 //25-15
  • 4, 30, 5 //30-25

Je veux éviter la classe for loop et la variable previous_val. Avez-vous des idées sur la façon de procéder en utilisant des flux ?

Solution de contournement

Vous pouvez utiliser intstream

intstream.range(0, lista.size())
    .map(index -> 
        new recordb(lista.get(index).getid(), lista.get(index).getvalue(),  lista.get(index).getvalue() - (index > 0 ? lista.get(index - 1).getvalue() : 0))
    )
    .collect(collectors.tolist())

C'est une méthode légèrement peu intuitive et j'ai dû la rechercher.
StackOverflow – Flux Java utilisant l'élément précédent dans Foreach Lambda.

Habituellement, l'utilisation des streams consiste à agréger un ensemble de valeurs, pas nécessairement pour les comparer et les contraster.
Leçon : Opérations d'agrégation (Les didacticiels Java™ > Collections).

Ceci est un exemple utilisant la classe Collector et la méthode Collector#of.

Essentiellement, lors de la collecte, vous récupérez l'élément précédent de ce qui a déjà été collecté.

Pour le paramètre BiConsumer, a est l'élément collecté jusqu'à présent.

list<recordb> l
    = lista.stream()
           .collect(
               collector.<recorda, list<recordb>, list<recordb>>of(
                   arraylist::new,
                   (a, b) -> {
                       if (a.isempty()) a.add(new recordb(b.id, b.value, 0));
                       else {
                           recordb x = a.get(a.size() - 1);
                           a.add(new recordb(b.id, b.value, b.value - x.value));
                       }
                   },
                   (a, b) -> {
                       a.addall(b);
                       return a;
                   },
                   x -> x));

Sortie

1, 10, 0
2, 15, 5
3, 25, 10
4, 30, 5

Enfin, vous souhaiterez peut-être vous débarrasser de la classe recordb et utiliser simplement Map.

Map<RecordA, Integer> m = new LinkedHashMap<>();
RecordA a, b;
m.put(a = listA.get(0), 0);
for (int i = 1, n = listA.size(); i < n; i++)
    m.put(b = listA.get(i), -a.value + (a = b).value);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer