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.
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
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;
};
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;
};
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