Essayez le type fonctionnel en Java! ①

1. introduction

L'interface fonctionnelle est fournie par java8, mais dans quelle mesure l'utilisez-vous dans votre produit? Dans le cas d'un produit qui est déjà en cours d'exécution, il peut être difficile de migrer dans de nombreux cas, mais j'ai senti qu'il y avait de nombreux avantages à l'utiliser dans le produit, donc cette fois j'utilise réellement l'original (interface fonctionnelle) (Non) Réécrivons l'exemple de code à l'aide de l'interface fonctionnelle.

2. Pratique fonctionnelle I / F avec une méthode de jugement d'image similaire

2.1 Flux de traitement

Voici le flux de traitement de la méthode de jugement d'image similaire donnée à titre d'exemple. On dit que vide est décrit comme une différence, mais null est retourné lorsque le type de fonction I / F n'est pas utilisé et Optional.empty est retourné lorsqu'il est utilisé.

Flux de traitement de la méthode de jugement d'image similaire


Rechercher des images à partir de la base de données par valeur de hachage d'image
      _____________↓____________
↓ Oui ↓ Aucun
Renvoyer les données d'image ↓
Rechercher des candidats à partir d'informations supplémentaires dans l'image
↓ Oui ↓ Aucun
                     ↓                      ↓
Rechercher des images similaires ↓
             ________↓_____Retour vide
↓ Oui ↓ Aucun
             ↓            ↓
Renvoyer des données d'image similaires Retour vide

2.2 Lorsque vous n'utilisez pas le type de fonction I / F

Implémentons le flux ci-dessus sans utiliser l'I / F. fonctionnelle. Voici un exemple de code.

Type de fonction I/F inutilisé


    /**
     * @param imageHash Valeur de hachage de l'image
     * @param addInfo Image ajouter des informations
     * @return 
     */
    public SimilarImageDto getImage(String imageHash, AddInfo addInfo) {
        //Recherche par correspondance exacte
        val image = imageRepository.get(imageHash) 

        //S'il existe, générez Dto et renvoyez-le
        if ( image != null ) {
             return SimilarImageDto.create(image);

        //Traitement lorsqu'il n'existe pas
        } else {
            //Rechercher des images de candidats à partir d'informations supplémentaires
            List<ImageInfo> imgInfoList = imageInfoRepository.find(addInfo);
            //Jugement de similarité des candidats. S'il n'existe pas, null est renvoyé.
            if (CollectionUtils.isEmpty(imgInfoList) ) {
                return null;
            }

            for (ImageInfo imgInfo : imgInfoList) {

                //Si une image similaire existe, générez un Dto et renvoyez-le
                if( isSimilar(imgInfo) ){
                    return SimilarImageDto.create(imgInfo);
                }       
            }
            return null;
        }
    }

   //Fonction de jugement d'image similaire
   private boolean isSimilar(ImageInfo imgInfo) = {
       //Traitement de recherche d'images similaires
        return isSimilar;
    };

2.3 Lorsque vous n'utilisez pas l'I / F fonctionnelle

Implémentons le flux ci-dessus en utilisant un I / F. fonctionnel. Voici un exemple de code.

Type de fonction I/Utiliser F


    /**
     * @param imgHash Valeur de hachage de l'image
     * @param addInfo Image ajouter des informations
     * @return 
     */
    public Optional<SimilarImageDto> getImageOpt(String imgHash, AddInfo addInfo) {
        return imageRepository //
          .getOpt(imgHash) //Recherche par correspondance exacte
          .map(img -> SimilarImageDto.create(img) )//S'il existe, générez Dto et renvoyez-le
          .orElseGet(() -> { //Traitement lorsqu'il n'existe pas
              return imageInfoRepository.find(addInfo) //Rechercher des images de candidats à partir d'informations supplémentaires
                 .detectOptional( imgInfo -> predicateSimilar.test(imgInfo) )//Jugement de similarité des candidats. Facultatif si non présent.vide est renvoyé.
                 .map( imgInfo -> SimilarImageDto.create(imgInfo) );//Si une image similaire existe, générez un Dto et renvoyez-le
          });
    }

   //Fonction de jugement d'image similaire
   private Predicate<ImageInfo> predicateSimilar = imgInfo -> {
       //Traitement de recherche d'images similaires
        return isSimilar;
    };

3. 3. Essayez d'utiliser une I / F fonctionnelle

Comment était-ce? Cette fois, c'était un flux simple, mais à mesure que cela se complique, la différence par rapport au cas où l'I / F fonctionnel n'est pas utilisé devient plus perceptible. L'avantage est que la quantité de code est raccourcie, mais quand je l'introduis réellement, je sens que la vérification de null n'est pas nécessaire, les effets secondaires sont réduits en utilisant des fonctions, la portée est naturellement réduite et elle est testée. Je sens que cela devient plus simple comme mérite.

Recommended Posts

Essayez le type fonctionnel en Java! ①
Détermination de type en Java
Essayez d'appeler JavaScript en Java
Essayez de développer Spresense avec Java (1)
Implémenter un tri rapide de type fonction en Java
Essayez d'implémenter Android Hilt en Java
Essayez d'exécuter Selenuim 3.141.59 avec eclipse (java)
Essayez une expression If en Java
Essayez d'exécuter AWS X-Ray en Java
Essayez d'implémenter Yuma en Java
Conversion de type Java
Concernant la comparaison d'équivalence de type de chaîne en Java
Essayez de résoudre Project Euler en Java
[Explication facile à comprendre! ] Conversion de type de type de référence en Java
Partition en Java
Essayez d'implémenter l'ajout n-aire en Java
Essayez d'utiliser l'API Stream en Java
[Java] Type d'énumération
Essayez Java 8 Stream
Java Type facultatif
Changements dans Java 11
Janken à Java
Essayez d'utiliser l'API au format JSON en Java
Essayez d'appeler le service CORBA sur Java 11+
Java double type
Créons une application de calcul avec Java
[Java] Interface fonctionnelle
Taux circonférentiel à Java
Essayez grossièrement Java 9
FizzBuzz en Java
Essayez de gratter environ 30 lignes en Java (sortie CSV)
Le type d'intersection introduit dans Java 10 est incroyable (?)
Essayez de créer un babillard en Java
À propos de var utilisé en Java (type de variable locale)
Deuxième décoction: essayez une expression If en Java
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Essayez d'utiliser Sourcetrail (version macOS) avec du code Java
Mémo organisé dans la tête (Java - type de données)
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
À propos de l'interface fonctionnelle Java
Lire JSON en Java
Implémentation de l'interpréteur par Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
interface de type de fonction standard java
Commentaires dans la source Java
[Java] Type de données ①-Type de base
Fonctions Azure en Java
Essayez LetCode dans Ruby-TwoSum
Formater XML en Java
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java