Komplexes Beispiel von funktionale Interfaces in Java

Abschließend zum Thema funktionale Interfaces in Java, soll dieses Beispiel ein etwas komplexeren Zusammenhang demonstrieren wie man funktionale Interfaces verwenden kann.
Dafür wird für eine Person eine email und Telefonnummer überprüft. Die email muss ein @ enthalten und die Telefonnummer mit 0 beginnen.
Dann werden mithilfe des RegistrationValidator eine Reihe von Lambda Expressions in Validator ausgeführt, um so zu sehen ob eine email und Telefonnummer das vorgegebene Muster erfüllen.

Person

package functional;

/** Simple Person */
public class Person {
    public String email;
    public String phonenumber;

    public Person(String email, String phonenumber){
        this.email = email;
        this.phonenumber = phonenumber;
    }
}

Validator

package functional;
import static functional.RegistrationValidator.*;

public class Validator {

    public static void main(String[] args){
        Person person = new Person("[email protected]","+01465518893");

        /* complex example how functional programming works in java */
        /* examine if email and phonenumber from the created person have the right pattern */
        ValidationResult result = isEmailValid()
        .and(isPhoneNumberValid())
        .apply(person);

        if (result != ValidationResult.SUCCESS){
            throw new IllegalStateException(result.name());
        } else {
            System.out.println(result);
        }
    }
    
}

RegistrationValidator

package functional;

import java.util.function.Function;
import static functional.RegistrationValidator.*;
import static functional.RegistrationValidator.ValidationResult.*;

@FunctionalInterface
public interface RegistrationValidator extends Function<Person, ValidationResult> {

        static RegistrationValidator isEmailValid() {
            return person -> person.email.contains("@") ? SUCCESS : EMAIL_INVALID;
        }

        static RegistrationValidator isPhoneNumberValid() {
            return person -> person.phonenumber.startsWith("+0") ? SUCCESS : PHONENUMBER_INVALID;
        }

        default RegistrationValidator and (RegistrationValidator other) {
            return person -> {
                ValidationResult result = this.apply(person);
                return result.equals(SUCCESS) ? other.apply(person) : result;
            };
        }

        enum ValidationResult {
            SUCCESS, EMAIL_INVALID, PHONENUMBER_INVALID;
        }
    }



0
0
0.000
10 comments
avatar
(Edited)

Wunderbar! Ich habe vor 30 Jahren in FORTRAN programmiert. Das war lange Zeit die meist verwendete Programmiersprache. Dann bin ich in UNIX eingestiegen, Shellscript und perl.
Nun bin ich froh, dass es genügend schlaue und fleißige Leute wie dich gibt, die professionell programmieren können.

Wenn du es schaffst, dein Programm in FORTRAN zu schreiben, bekommst du von mir 5 HIVE, lol.

0
0
0.000
avatar

FORTRAN sagt mir was, habe ich aber glaube ich noch nie verwendet.
Heutzutage gibt es viele von diesen höhere Programmiersprachen wie Java, Kotlin, c#, ... was einem die Arbeit auch etwas vereinfacht. Ich kann mir gut vorstellen, dass es zu damaligen Zeiten schwieriger bzw. zeitaufwändiger war größeren Code zu schreiben.
!BBH

0
0
0.000
avatar

@herz-ass! Your Content Is Awesome so I just sent 1 $BBH (Bitcoin Backed Hive) to your account on behalf of @ozelot47. (2/5)

0
0
0.000
avatar

Für dich auch paar Tokens für die Sammlung.

!BBH !WITZ !SLOTH

0
0
0.000
avatar

@ozelot47! Your Content Is Awesome so I just sent 1 $BBH (Bitcoin Backed Hive) to your account on behalf of @dotwin1981. (18/50)

0
0
0.000