Functie: Gegevenstransformatie
Terwijl Predicate ons helpt bij het evalueren van booleaanse expressies, stelt Function ons in staat om gegevens te transformeren door bewerkingen toe te passen die resultaten opleveren op basis van de invoer.
Function wordt vaak gebruikt voor gegevens transformatie, zoals typeconversie, berekeningen of waardeverwerking.
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
De interface Function<T, R> in Java vertegenwoordigt een functionele interface die een argument van het type T aanneemt en een resultaat van het type R retourneert.
De methode apply(T t) voert de datatransformatie uit door de invoervaarde te nemen en het resultaat terug te geven. Dit maakt het mogelijk om flexibele functies te creëren voor het verwerken van gegevens van verschillende typen.
Praktische Toepassing
Stel, er is een lijst met gebruikersnamen en het is nodig om de lengte van elke naam te berekenen voor verdere analyse of gegevensverwerking.
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.function.Function; public class Main { public static void main(String[] args) { List<String> users = Arrays.asList("Alice", "Bob", "Charlie", "David"); Function<String, Integer> nameLength = name -> name.length(); users.forEach(user -> { System.out.println(user + " has " + nameLength.apply(user) + " characters."); }); } }
In dit voorbeeld heb je een lijst met gebruikersnamen. Voor elke naam gebruik je de functie nameLength, die het aantal tekens in de naam bepaalt met behulp van de methode length(). Met de methode forEach itereer je over elk element van de lijst en druk je een bericht af dat toont hoeveel tekens elke naam bevat.
Functies Combineren
De interface Function biedt verschillende methoden voor het combineren van functies, waarmee je een keten van bewerkingen kunt creëren.
Methode andThen()
De methode andThen() maakt het mogelijk om twee functies te combineren door eerst één functie toe te passen en vervolgens het resultaat door te geven aan de tweede functie. Dit is nuttig wanneer je meerdere bewerkingen opeenvolgend wilt uitvoeren.
Voorbeeld
Er is een lijst met gebruikersnamen en het is nodig om de eerste letter van elke naam te capitaliseren en vervolgens te controleren of de naam meer dan 5 tekens bevat.
Main.java
1234567891011121314151617181920212223package com.example; import java.util.Arrays; import java.util.List; import java.util.function.Function; public class Main { public static void main(String[] args) { List<String> usernames = Arrays.asList("john", "alice", "bob", "charlie", "david"); // Capitalize first letter Function<String, String> capitalizeFirstLetter = name -> name.substring(0, 1).toUpperCase() + name.substring(1); // Check if the username has more than 5 characters Function<String, Boolean> isLongerThanFive = name -> name.length() > 5; // Combine functions using `andThen()` Function<String, Boolean> formattedNameThenCheckLength = capitalizeFirstLetter.andThen(isLongerThanFive); usernames.forEach(user -> { System.out.println(user + " -> " + formattedNameThenCheckLength.apply(user)); }); } }
Eerst wordt de eerste letter van elke gebruikersnaam gecapitaliseerd met capitalizeFirstLetter. Vervolgens wordt gecontroleerd of de opgemaakte gebruikersnaam meer dan 5 tekens bevat met isLongerThanFive. De twee functies worden gecombineerd met andThen() voor sequentiële verwerking.
Methode compose()
De methode compose() maakt het mogelijk om functies te combineren, maar in de omgekeerde volgorde: de tweede functie wordt eerst toegepast, en het resultaat wordt vervolgens doorgegeven aan de eerste functie.
Voorbeeld
Je hebt een string en wilt eerst de lengte berekenen en vervolgens een prefix toevoegen aan het resultaat.
Main.java
123456789101112131415161718package com.example; import java.util.function.Function; public class Main { public static void main(String[] args) { String phrase = "Hello World"; // First, calculate the length, then add a prefix Function<String, Integer> stringLength = String::length; Function<Integer, String> addPrefix = length -> "Length: " + length; // Combine functions using compose Function<String, String> lengthThenPrefix = addPrefix.compose(stringLength); System.out.println(lengthThenPrefix.apply(phrase)); // Output: Length: 11 } }
In dit voorbeeld bereken je eerst de lengte van de string met stringLength, waarna het resultaat wordt doorgegeven aan de functie addPrefix, die een voorvoegsel toevoegt. Je gebruikt compose() om de functies in de gewenste volgorde toe te passen.
Methode identity()
De methode identity() retourneert een functie die eenvoudigweg zijn argument zonder enige wijzigingen teruggeeft. Dit is handig wanneer je een functie moet doorgeven die de invoerwaarde niet verandert, maar wel vereist is om aan de interface te voldoen.
Voorbeeld
Stel je voor dat je een lijst met gebruikersnamen moet verwerken door verschillende transformaties toe te passen: één om de namen naar hoofdletters te converteren, een andere om het achtervoegsel "User" toe te voegen, en een derde met de functie identity() om de naam onveranderd te laten. De taak is om deze functies op elke naam in de lijst toe te passen, terwijl de interface van het programma voor elke transformatie consistent blijft.
Main.java
1234567891011121314151617181920212223242526272829303132package com.example; import java.util.List; import java.util.Arrays; import java.util.function.Function; public class Main { public static void main(String[] args) { List<String> usernames = Arrays.asList("alice", "bob", "charlie", "david", "eve"); // `Function` to convert the username to uppercase Function<String, String> uppercaseFunction = name -> name.toUpperCase(); // `Function` to add the "User" suffix Function<String, String> suffixFunction = name -> name + "User"; // Identity `Function`, which does nothing Function<String, String> identityFunction = Function.identity(); // Applying a combination of functions List<Function<String, ?>> transformations = Arrays.asList(uppercaseFunction, suffixFunction, identityFunction); // Applying each `Function` from the list for (Function<String, ?> transformation : transformations) { System.out.println("--------------------"); usernames.stream() .map(name -> transformation.apply(name)) .forEach(System.out::println); } } }
Zoals je kunt zien, bestaat de uitvoer uit drie opgemaakte lijsten van gebruikersnamen. De laatste lijst bevat de originele namen, waarbij de identity()-methode van pas komt, omdat deze ons in staat stelt de namen te retourneren zonder extra logica toe te voegen voor het verwerken van de onveranderde waarden. Dit maakt de code netter en efficiënter door direct identity() te gebruiken wanneer er geen transformatie nodig is.
1. Wat doet de methode andThen() in de Function-interface?
2. Wat is het resultaat bij het toepassen van de identity()-methode?
3. Wat doet de compose()-methode?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 2.33
Functie: Gegevenstransformatie
Veeg om het menu te tonen
Terwijl Predicate ons helpt bij het evalueren van booleaanse expressies, stelt Function ons in staat om gegevens te transformeren door bewerkingen toe te passen die resultaten opleveren op basis van de invoer.
Function wordt vaak gebruikt voor gegevens transformatie, zoals typeconversie, berekeningen of waardeverwerking.
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
De interface Function<T, R> in Java vertegenwoordigt een functionele interface die een argument van het type T aanneemt en een resultaat van het type R retourneert.
De methode apply(T t) voert de datatransformatie uit door de invoervaarde te nemen en het resultaat terug te geven. Dit maakt het mogelijk om flexibele functies te creëren voor het verwerken van gegevens van verschillende typen.
Praktische Toepassing
Stel, er is een lijst met gebruikersnamen en het is nodig om de lengte van elke naam te berekenen voor verdere analyse of gegevensverwerking.
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.function.Function; public class Main { public static void main(String[] args) { List<String> users = Arrays.asList("Alice", "Bob", "Charlie", "David"); Function<String, Integer> nameLength = name -> name.length(); users.forEach(user -> { System.out.println(user + " has " + nameLength.apply(user) + " characters."); }); } }
In dit voorbeeld heb je een lijst met gebruikersnamen. Voor elke naam gebruik je de functie nameLength, die het aantal tekens in de naam bepaalt met behulp van de methode length(). Met de methode forEach itereer je over elk element van de lijst en druk je een bericht af dat toont hoeveel tekens elke naam bevat.
Functies Combineren
De interface Function biedt verschillende methoden voor het combineren van functies, waarmee je een keten van bewerkingen kunt creëren.
Methode andThen()
De methode andThen() maakt het mogelijk om twee functies te combineren door eerst één functie toe te passen en vervolgens het resultaat door te geven aan de tweede functie. Dit is nuttig wanneer je meerdere bewerkingen opeenvolgend wilt uitvoeren.
Voorbeeld
Er is een lijst met gebruikersnamen en het is nodig om de eerste letter van elke naam te capitaliseren en vervolgens te controleren of de naam meer dan 5 tekens bevat.
Main.java
1234567891011121314151617181920212223package com.example; import java.util.Arrays; import java.util.List; import java.util.function.Function; public class Main { public static void main(String[] args) { List<String> usernames = Arrays.asList("john", "alice", "bob", "charlie", "david"); // Capitalize first letter Function<String, String> capitalizeFirstLetter = name -> name.substring(0, 1).toUpperCase() + name.substring(1); // Check if the username has more than 5 characters Function<String, Boolean> isLongerThanFive = name -> name.length() > 5; // Combine functions using `andThen()` Function<String, Boolean> formattedNameThenCheckLength = capitalizeFirstLetter.andThen(isLongerThanFive); usernames.forEach(user -> { System.out.println(user + " -> " + formattedNameThenCheckLength.apply(user)); }); } }
Eerst wordt de eerste letter van elke gebruikersnaam gecapitaliseerd met capitalizeFirstLetter. Vervolgens wordt gecontroleerd of de opgemaakte gebruikersnaam meer dan 5 tekens bevat met isLongerThanFive. De twee functies worden gecombineerd met andThen() voor sequentiële verwerking.
Methode compose()
De methode compose() maakt het mogelijk om functies te combineren, maar in de omgekeerde volgorde: de tweede functie wordt eerst toegepast, en het resultaat wordt vervolgens doorgegeven aan de eerste functie.
Voorbeeld
Je hebt een string en wilt eerst de lengte berekenen en vervolgens een prefix toevoegen aan het resultaat.
Main.java
123456789101112131415161718package com.example; import java.util.function.Function; public class Main { public static void main(String[] args) { String phrase = "Hello World"; // First, calculate the length, then add a prefix Function<String, Integer> stringLength = String::length; Function<Integer, String> addPrefix = length -> "Length: " + length; // Combine functions using compose Function<String, String> lengthThenPrefix = addPrefix.compose(stringLength); System.out.println(lengthThenPrefix.apply(phrase)); // Output: Length: 11 } }
In dit voorbeeld bereken je eerst de lengte van de string met stringLength, waarna het resultaat wordt doorgegeven aan de functie addPrefix, die een voorvoegsel toevoegt. Je gebruikt compose() om de functies in de gewenste volgorde toe te passen.
Methode identity()
De methode identity() retourneert een functie die eenvoudigweg zijn argument zonder enige wijzigingen teruggeeft. Dit is handig wanneer je een functie moet doorgeven die de invoerwaarde niet verandert, maar wel vereist is om aan de interface te voldoen.
Voorbeeld
Stel je voor dat je een lijst met gebruikersnamen moet verwerken door verschillende transformaties toe te passen: één om de namen naar hoofdletters te converteren, een andere om het achtervoegsel "User" toe te voegen, en een derde met de functie identity() om de naam onveranderd te laten. De taak is om deze functies op elke naam in de lijst toe te passen, terwijl de interface van het programma voor elke transformatie consistent blijft.
Main.java
1234567891011121314151617181920212223242526272829303132package com.example; import java.util.List; import java.util.Arrays; import java.util.function.Function; public class Main { public static void main(String[] args) { List<String> usernames = Arrays.asList("alice", "bob", "charlie", "david", "eve"); // `Function` to convert the username to uppercase Function<String, String> uppercaseFunction = name -> name.toUpperCase(); // `Function` to add the "User" suffix Function<String, String> suffixFunction = name -> name + "User"; // Identity `Function`, which does nothing Function<String, String> identityFunction = Function.identity(); // Applying a combination of functions List<Function<String, ?>> transformations = Arrays.asList(uppercaseFunction, suffixFunction, identityFunction); // Applying each `Function` from the list for (Function<String, ?> transformation : transformations) { System.out.println("--------------------"); usernames.stream() .map(name -> transformation.apply(name)) .forEach(System.out::println); } } }
Zoals je kunt zien, bestaat de uitvoer uit drie opgemaakte lijsten van gebruikersnamen. De laatste lijst bevat de originele namen, waarbij de identity()-methode van pas komt, omdat deze ons in staat stelt de namen te retourneren zonder extra logica toe te voegen voor het verwerken van de onveranderde waarden. Dit maakt de code netter en efficiënter door direct identity() te gebruiken wanneer er geen transformatie nodig is.
1. Wat doet de methode andThen() in de Function-interface?
2. Wat is het resultaat bij het toepassen van de identity()-methode?
3. Wat doet de compose()-methode?
Bedankt voor je feedback!