Maison > Java > le corps du texte

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

WBOY
Libérer: 2024-02-22 14:00:10
avant
636 Les gens l'ont consulté

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());
    }
}
Copier après la connexion

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())
Copier après la connexion

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));
Copier après la connexion

Sortie

1, 10, 0
2, 15, 5
3, 25, 10
4, 30, 5
Copier après la connexion

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);
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!