Probieren Sie den Funktionstyp in Java aus! ①

1. 1. Einführung

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.

2. Funktionale I / F-Praxis mit ähnlicher Bildbeurteilungsmethode

2.1 Ablauf

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

2.2 Wenn Sie den Funktionstyp I / F nicht verwenden

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

2.3 Wenn Sie keine funktionierende I / F verwenden

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

3. 3. Versuchen Sie es mit einem funktionierenden I / F.

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

Probieren Sie den Funktionstyp in Java aus! ①
Typbestimmung in Java
Versuchen Sie, JavaScript in Java aufzurufen
Lassen Sie uns Spresense mit Java entwickeln (1)
Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
Versuchen Sie, Android Hilt in Java zu implementieren
Versuchen Sie, Selenuim 3.141.59 mit Eclipse (Java) auszuführen.
Versuchen Sie einen If-Ausdruck in Java
Versuchen Sie, AWS X-Ray in Java auszuführen
Versuchen Sie, Yuma in Java zu implementieren
Java-Typkonvertierung
In Bezug auf den Vergleich der Zeichenfolgentypäquivalenz in Java
Versuchen Sie, Project Euler in Java zu lösen
[Leicht verständliche Erklärung! ] Konvertierung des Referenztyptyps in Java
Partisierung in Java
Versuchen Sie, n-ary Addition in Java zu implementieren
Versuchen Sie es mit der Stream-API in Java
[Java] Aufzählungstyp
Probieren Sie Java 8 Stream aus
Java Optionaler Typ
Änderungen in Java 11
Janken in Java
Versuchen Sie es mit der JSON-Format-API in Java
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Java-Doppeltyp
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
[Java] Funktionsschnittstelle
Umfangsrate in Java
Versuchen Sie es mit Java 9
FizzBuzz in Java
Versuchen Sie, etwa 30 Zeilen in Java zu kratzen (CSV-Ausgabe)
Der in Java 10 eingeführte Schnittpunkttyp ist erstaunlich (?)
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Informationen zu in Java verwendeten Variablen (lokaler Variablentyp)
Zweite Abkochung: Versuchen Sie einen If-Ausdruck in Java
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Versuchen Sie es mit Sourcetrail (MacOS-Version) mit Java-Code
Organisiertes Memo im Kopf (Java - Datentyp)
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Informationen zur Java-Funktionsschnittstelle
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Java-Standardfunktionstyp-Schnittstelle
Kommentare in der Java-Quelle
[Java] Datentyp ①-Basistyp
Azure funktioniert in Java
Versuchen Sie LetCode in Ruby-TwoSum
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java