[Java] Gestion des Java Beans dans la chaîne de méthodes

J'ai réfléchi à la manière de gérer les objets créés par JavaBeans dans une chaîne de méthodes.

Spécification des Java Beans

Je ne sais pas si c'est la spécification exacte, mais les spécifications JavaBeans communes sont les suivantes.

Il y a beaucoup d'autres choses, mais la plus importante est celle-ci. Cliquez ici pour les spécifications officielles → Java Beans Spec

HogeBean.java


public class HogeBean {

    private String name;

    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

Comme ça. Avec lombok

HogeBean.java


@Data
public class HogeBean {

    private String name;

    private String id;
}

C'est acceptable.

Problèmes avec la chaîne de méthodes

Par exemple, supposons que vous ayez un HogeBean et un FugaBean avec des champs similaires.

HogeBean.java


@Data
public class HogeBean {

    private String name;

    private String id;
}

FugaBean.java


@Data
public class FugaBean {

    private String id;

    private String password;
}

Si vous voulez convertir HogeBean en FugaBean dans Stream, pensez normalement

List<HogeBean> hoges = ...

hoges.stream().map(hoge -> {

    FugaBean fuga = new FugaBean();
    fuga.setId(hoge.getId());
    return fuga;
    
}).Résiliation

Je n'écrirai que comme ça. Ce n'est pas si beau.

Solution 1 Classe anonyme + initialiseur d'instance

Ce n'est peut-être pas très beau, mais le crochet du milieu + retour dans la carte est un motif qui peut être évité.

hoges.stream().map(hoge -> new FugaBean(){
    {
        setId(hoge.getId());
    }
}).Résiliation

C'est beaucoup plus propre qu'avant. Mais il y a des inconvénients

Solution 2 Faites en sorte que le setter se renvoie lui-même afin que l'objet puisse être créé en une seule ligne.

L'option pour quitter JavaBeans. Modifiez le poseur comme suit.

FugaBean.java


    public HogeBean setId(String id) {
        this.id = id;
        return this;
    }

Pour lombok, ajoutez simplement des accessoires (chain = true)

FugaBean.java


@Data
@Accessors(chain = true)

Le traitement de la question peut être effectué comme suit

hoges.stream().map(hoge -> new FugaBean().setId(hoge.getId())).Résiliation

Rafraîchissant. Mais après tout, il y a des inconvénients,

Solution 3 Créez un petit constructeur

Comme ça

BeanCreater.java


public final class BeanCreater<T> {

    private BeanCreater() {
    }

    private T bean;

    public static <T> BeanCreater<T> of(Supplier<T> supplier) {

        BeanCreater<T> builder = new BeanCreater<T>();
        builder.bean = supplier.get();

        return builder;

    }
    
    public BeanCreater<T> construct(Consumer<T> consumer) {

        consumer.accept(this.bean);
        return this;
    }
    
    public T build() {
        return this.bean;
    }

}

Avec ça,

hoges.stream().map(hoge -> BeanCreater.of(FugaBean::new)
    .construct(bean -> bean.setId(hoge.getId())).build()).Résiliation

Hmm. Je l'ai essayé, mais ce n'est pas assez bon. Le code est trop bruyant.

Conclusion

Personnellement, j'aime le plus la solution 2. Il a une interface fluide, et il n'y a pas de gaspillage dans l'essence et les discours cérémoniels. J'espère que JavaBeans sera plus flexible compte tenu de la situation actuelle. (Je ne pense pas que ce soit le cas ...) Cliquez ici pour le BeanCreater créé cette fois https://github.com/7tsuno/BeanCreater

S'il vous plaît aviser si vous avez d'autres idées!

Recommended Posts

[Java] Gestion des Java Beans dans la chaîne de méthodes
Nom de méthode de la chaîne de méthodes dans Java Builder + α
Appelez la super méthode en Java
Quelle est la méthode principale en Java?
L'histoire de l'écriture de Java dans Emacs
[Order method] Définit l'ordre des données dans Rails
L'histoire de la comparaison de chaînes de bas niveau en Java
L'histoire de la fabrication d'un Othello ordinaire à Java
À propos de l'idée des classes anonymes en Java
L'ordre des modificateurs de méthode Java est fixe
L'histoire de l'apprentissage de Java dans la première programmation
Mesurer la taille d'un dossier avec Java
Ressentez le passage du temps même à Java
Importer des fichiers de la même hiérarchie en Java
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Obtenez l'URL de la destination de la redirection HTTP en Java
[Java] Récupère le fichier dans le fichier jar quel que soit l'environnement
Modifier la qualité de stockage des images JPEG en Java
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
À propos de la gestion de Null
[Java] Pratique de la gestion des exceptions [Exception]
Avantages de la méthode statique Java
Implémentation Java de tri-tree
Techniques de gestion des exceptions en Java
[Java] Informations entières des caractères du fichier texte acquises par la méthode read ()
Comment obtenir le nom d'une classe / méthode exécutée en Java
A été effectué dans l'année de base de la semaine calendaire Java
J'ai traduit [Méthode Clone pour les tableaux Java] comme méthode Clone dans les tableaux Java.
Une explication rapide des cinq types de statique Java
[Android, Java] Méthode pratique pour calculer la différence en jours
Créer une méthode pour renvoyer le taux de taxe en Java
Comptez le nombre de chiffres après la virgule décimale en Java
Comment dériver le dernier jour du mois en Java
Récapitulatif des valeurs renvoyées par la méthode des caractéristiques Spliterator #java
Accéder à l'interface réseau avec Java
[Java] Supprimer les éléments de la liste
Devinez le code de caractère en Java
[Édition Java] Histoire de la sérialisation
Méthode de redimensionnement automatique des photos par Java
Spécifiez l'emplacement Java dans eclipse.ini
Comparaison Java à l'aide de la méthode compareTo ()
Décompressez le fichier zip en Java
Gestion des fuseaux horaires avec Java
[Note] Gestion des points décimaux Java
Liste des membres ajoutés dans Java 9
À propos du rôle de la méthode initialize
Analyser l'analyse syntaxique de l'API COTOHA en Java
Compréhension étape par étape de la gestion des exceptions Java
Liste des types ajoutés dans Java 9
Ordre de traitement dans le programme
L'origine des expressions Java lambda
Implémentation d'une fonction similaire en Java
Gestion de la virgule flottante java Lors de la lecture du livre de référence [Note]
Examiner les informations système de l'environnement d'exploitation AWS Lambda en Java
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
Sortie de la différence entre chaque champ de deux objets en Java
Examiner la liste des polices disponibles dans AWS Lambda + Java
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Examinez la liste des ID de fuseau horaire disponibles dans la classe Java ZoneId
Obtenez l'URL publique du fichier privé de Flickr en Java