Die Funktionsschnittstelle wurde seit java8 bereitgestellt, aber wie oft verwenden Sie sie in Ihrem Produkt? Im Fall eines Produkts, das bereits ausgeführt wird, kann die Migration in vielen Fällen schwierig sein, aber ich hatte das Gefühl, dass es viele Vorteile gibt, wenn es tatsächlich im Produkt verwendet wird. Daher verwende ich dieses Mal tatsächlich das Original (funktionale Schnittstelle). (Nein) Schreiben wir den Beispielcode über die Funktionsschnittstelle neu.
Das Folgende ist der Verarbeitungsablauf des ähnlichen Bildbeurteilungsverfahrens, das als Beispiel angegeben ist. Es wird gesagt, dass leer als Unterschied beschrieben wird, aber null wird zurückgegeben, wenn der Funktionstyp I / F nicht verwendet wird, und Optional.empty wird zurückgegeben, wenn es verwendet wird.
Verarbeitungsablauf für ein ähnliches Bildbeurteilungsverfahren
Suchen Sie Bilder aus der Datenbank nach dem Bild-Hash-Wert
_____________↓____________
↓ Ja ↓ Keine
Bilddaten zurückgeben ↓
Suchen Sie nach Kandidaten anhand zusätzlicher Informationen im Bild
↓ Ja ↓ Keine
↓ ↓
Suche nach ähnlichen Bildern ↓
________↓_____Leere Rückgabe
↓ Ja ↓ Keine
↓ ↓
Ähnliche Bilddaten zurückgeben Leere Rückgabe
Lassen Sie uns den obigen Ablauf implementieren, ohne funktionale I / F zu verwenden. Unten finden Sie ein Codebeispiel.
Funktionstyp I./F unbenutzt
/**
* @param imageHash Bild-Hashwert
* @param addInfo Bildinformationen hinzufügen
* @return
*/
public SimilarImageDto getImage(String imageHash, AddInfo addInfo) {
//Suche nach exakter Übereinstimmung
val image = imageRepository.get(imageHash)
//Wenn es existiert, generieren Sie Dto und geben Sie es zurück
if ( image != null ) {
return SimilarImageDto.create(image);
//Verarbeitung, wenn sie nicht vorhanden ist
} else {
//Suchen Sie nach Kandidatenbildern aus zusätzlichen Informationen
List<ImageInfo> imgInfoList = imageInfoRepository.find(addInfo);
//Ähnlichkeitsbeurteilung von Kandidaten. Wenn es nicht existiert, wird null zurückgegeben.
if (CollectionUtils.isEmpty(imgInfoList) ) {
return null;
}
for (ImageInfo imgInfo : imgInfoList) {
//Wenn ein ähnliches Bild vorhanden ist, generieren Sie Dto und geben Sie es zurück
if( isSimilar(imgInfo) ){
return SimilarImageDto.create(imgInfo);
}
}
return null;
}
}
//Ähnliche Bildbeurteilungsfunktion
private boolean isSimilar(ImageInfo imgInfo) = {
//Ähnliche Bildsuchverarbeitung
return isSimilar;
};
Lassen Sie uns den obigen Ablauf mit einem funktionalen I / F implementieren. Unten finden Sie ein Codebeispiel.
Funktionstyp I./Verwenden Sie F.
/**
* @param imgHash Bild-Hashwert
* @param addInfo Bildinformationen hinzufügen
* @return
*/
public Optional<SimilarImageDto> getImageOpt(String imgHash, AddInfo addInfo) {
return imageRepository //
.getOpt(imgHash) //Suche nach exakter Übereinstimmung
.map(img -> SimilarImageDto.create(img) )//Wenn es existiert, generieren Sie Dto und geben Sie es zurück
.orElseGet(() -> { //Verarbeitung, wenn sie nicht vorhanden ist
return imageInfoRepository.find(addInfo) //Suchen Sie nach Kandidatenbildern aus zusätzlichen Informationen
.detectOptional( imgInfo -> predicateSimilar.test(imgInfo) )//Ähnlichkeitsbeurteilung von Kandidaten. Optional, wenn nicht vorhanden.leer wird zurückgegeben.
.map( imgInfo -> SimilarImageDto.create(imgInfo) );//Wenn ein ähnliches Bild vorhanden ist, generieren Sie Dto und geben Sie es zurück
});
}
//Ähnliche Bildbeurteilungsfunktion
private Predicate<ImageInfo> predicateSimilar = imgInfo -> {
//Ähnliche Bildsuchverarbeitung
return isSimilar;
};
Wie war es? Diesmal war es ein einfacher Ablauf, aber je komplizierter es wird, desto deutlicher wird der Unterschied zu dem Fall, in dem das funktionale I / F nicht verwendet wird. Der Vorteil ist, dass die Codemenge verkürzt wird, aber wenn ich sie tatsächlich einführe, halte ich eine Nullprüfung für unnötig, Nebenwirkungen werden durch die Verwendung von Funktionen reduziert, der Umfang wird natürlich reduziert und es wird getestet. Ich habe das Gefühl, dass es als Verdienst einfacher wird.
Recommended Posts