Sono tornate le Java Pills! 🎉

🕐 Tempo di lettura: 2 minuti

Da un annetto ormai affido spesso piccoli problemi di sviluppo all'IA ottimizzando il mio flusso di lavoro.

Oggi, ad esempio, ho delegato un problema legato all'aggregazione di dati. Ho fornito all'IA il seguente prompt:

Ho una lista listA contenente oggetti di tipo A (a1, a2, …, aN), ciascuno caratterizzato da un identificatore id e da una lista listB. Il mio obiettivo è aggregare le listB per tutti gli oggetti di tipo A aventi lo stesso id.

Ad esempio, se a1 e a3 condividono lo stesso id, i loro elementi listB devono essere unificati. Il risultato atteso deve essere una nuova lista contenente un solo oggetto di tipo A per ogni id, con la listB aggregata.

📌 Perché ho scelto di delegare il problema all'IA?

Invece di risolverlo manualmente (mentre già gestivo più attività in parallelo), ho scelto di affidarlo direttamente all'IA. Questo approccio mi ha permesso di:

🔎 Un aspetto interessante è che non ho dovuto fornire dettagli specifici sul dominio: ho descritto il problema in modo astratto (con parametri generici come A e B), evitando di rivelare informazioni sensibili sul progetto. Questo ha reso il suggerimento dell'IA riutilizzabile e generalizzabile.

📌 La soluzione proposta dall'IA

L'IA ha suggerito diverse soluzioni, tra cui un'implementazione basata sulle Stream API di Java e su Collectors.groupingBy, perfettamente in linea con gli standard del progetto (stile funzionale).

Il codice generato permette di raggruppare gli oggetti in base al loro identificatore e di aggregare le liste listB in modo efficiente. Il risultato è un codice chiaro, leggibile, efficiente e facilmente mantenibile. Questo dimostra come l'IA non sia soltanto uno strumento per scrivere codice, ma un valido supporto nello sviluppo software: assegnandole problemi ben definiti, è possibile accelerare il lavoro, ottenere suggerimenti eleganti e migliorare la qualità complessiva del codice senza perdere il controllo sulle decisioni progettuali.

Se preferisci non modificare gli oggetti originali ma crearne di nuovi, puoi raggruppare per id e poi unire le liste:

final List<A> mergedList = listA.stream()
        .collect(Collectors.groupingBy(A::getId))
        .entrySet().stream()
        .map(entry -> {
            final Integer id = entry.getKey();
            //unisce tutte le liste listB degli oggetti con lo stesso id
            final List<B> mergedListB = entry.getValue().stream()
                    .flatMap(a -> a.getListB().stream())
                    .collect(Collectors.toList());
            //crea un nuovo oggetto A con l'id e la lista unita
            return new A(id, mergedListB);
        })
        .collect(Collectors.toList());

Alla prossima pillola! ☕