Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Funktion: Datatransformation | Grunder och Funktionella Möjligheter med Stream API
Stream API

bookFunktion: Datatransformation

Medan Predicate hjälper oss att utvärdera boolean-uttryck, möjliggör Function att transformera data genom att tillämpa operationer som returnerar resultat baserat på inmatning.

Function används ofta för datatransformation, såsom typkonvertering, beräkningar eller värdehantering.

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

Function<T, R>-gränssnittet i Java representerar ett funktionellt gränssnitt som tar ett argument av typen T och returnerar ett resultat av typen R.

Metoden apply(T t) utför datatransformationen genom att ta inmatningsvärdet och returnera resultatet. Detta möjliggör skapandet av flexibla funktioner för att bearbeta data av olika typer.

Praktisk tillämpning

Anta att du har en lista med användarnamn, och du behöver beräkna längden på varje namn för vidare analys eller databearbetning.

Main.java

Main.java

copy
1234567891011121314151617
package 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."); }); } }

I detta exempel har du en lista med användarnamn. För varje namn använder du funktionen nameLength, som beräknar antalet tecken i namnet med hjälp av metoden length(). Med metoden forEach itererar du över varje element i listan och skriver ut ett meddelande som visar hur många tecken varje namn innehåller.

Kombinera funktioner

Gränssnittet Function tillhandahåller flera metoder för kombinering av funktioner, vilket gör det möjligt att skapa en kedja av operationer.

Metod andThen()

Metoden andThen() gör det möjligt att kombinera två funktioner genom att först tillämpa en funktion och sedan skicka resultatet till den andra funktionen. Detta är användbart när du behöver utföra flera operationer i följd.

Exempel

Du har en lista med användarnamn, och du behöver göra första bokstaven versal i varje namn och sedan kontrollera om namnet har fler än 5 tecken.

Main.java

Main.java

copy
1234567891011121314151617181920212223
package 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)); }); } }

Du gör först första bokstaven versal i varje användarnamn med hjälp av capitalizeFirstLetter. Därefter kontrollerar du om det formaterade användarnamnet har fler än 5 tecken med isLongerThanFive. De två funktionerna kombineras med andThen() för sekventiell bearbetning.

Metod compose()

Metoden compose() möjliggör att kombinera funktioner, men i omvänd ordning: den andra funktionen tillämpas först, och resultatet skickas sedan till den första funktionen.

Exempel

Du har en sträng och vill först beräkna dess längd och sedan lägga till ett prefix till resultatet.

Main.java

Main.java

copy
123456789101112131415161718
package 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 } }

I det här exemplet beräknas först längdensträngen med hjälp av stringLength, och sedan skickas resultatet vidare till funktionen addPrefix, som lägger till ett prefix. Du använder compose() för att tillämpa funktionerna i önskad ordning.

Metod identity()

Metoden identity() returnerar en funktion som helt enkelt returnerar sitt argument utan några ändringar. Detta är användbart när du behöver skicka en funktion som inte ändrar indatavärdet men krävs för att uppfylla gränssnittet.

Exempel

Föreställ dig att du behöver bearbeta en lista med användarnamn genom att tillämpa flera transformationer: en för att konvertera namnen till versaler, en annan för att lägga till suffixet "User", och en tredje med funktionen identity() för att lämna namnet oförändrat. Uppgiften är att tillämpa dessa funktioner på varje namn i listan samtidigt som programmets gränssnitt hålls konsekvent för varje transformation.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132
package 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); } } }

Som du kan se består utdata av tre formaterade listor med användarnamn. Den sista listan innehåller de ursprungliga namnen, vilket är där metoden identity() är användbar, eftersom den gör det möjligt att returnera namnen utan att lägga till extra logik för att hantera oförändrade värden. Detta gör koden renare och mer effektiv genom att direkt använda identity() när ingen transformation behövs.

1. Vad gör metoden andThen() i gränssnittet Function?

2. Vad blir resultatet när metoden identity() används?

3. Vad gör metoden compose()?

question mark

Vad gör metoden andThen() i gränssnittet Function?

Select the correct answer

question mark

Vad blir resultatet när metoden identity() används?

Select the correct answer

question mark

Vad gör metoden compose()?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 6

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Awesome!

Completion rate improved to 2.33

bookFunktion: Datatransformation

Svep för att visa menyn

Medan Predicate hjälper oss att utvärdera boolean-uttryck, möjliggör Function att transformera data genom att tillämpa operationer som returnerar resultat baserat på inmatning.

Function används ofta för datatransformation, såsom typkonvertering, beräkningar eller värdehantering.

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

Function<T, R>-gränssnittet i Java representerar ett funktionellt gränssnitt som tar ett argument av typen T och returnerar ett resultat av typen R.

Metoden apply(T t) utför datatransformationen genom att ta inmatningsvärdet och returnera resultatet. Detta möjliggör skapandet av flexibla funktioner för att bearbeta data av olika typer.

Praktisk tillämpning

Anta att du har en lista med användarnamn, och du behöver beräkna längden på varje namn för vidare analys eller databearbetning.

Main.java

Main.java

copy
1234567891011121314151617
package 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."); }); } }

I detta exempel har du en lista med användarnamn. För varje namn använder du funktionen nameLength, som beräknar antalet tecken i namnet med hjälp av metoden length(). Med metoden forEach itererar du över varje element i listan och skriver ut ett meddelande som visar hur många tecken varje namn innehåller.

Kombinera funktioner

Gränssnittet Function tillhandahåller flera metoder för kombinering av funktioner, vilket gör det möjligt att skapa en kedja av operationer.

Metod andThen()

Metoden andThen() gör det möjligt att kombinera två funktioner genom att först tillämpa en funktion och sedan skicka resultatet till den andra funktionen. Detta är användbart när du behöver utföra flera operationer i följd.

Exempel

Du har en lista med användarnamn, och du behöver göra första bokstaven versal i varje namn och sedan kontrollera om namnet har fler än 5 tecken.

Main.java

Main.java

copy
1234567891011121314151617181920212223
package 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)); }); } }

Du gör först första bokstaven versal i varje användarnamn med hjälp av capitalizeFirstLetter. Därefter kontrollerar du om det formaterade användarnamnet har fler än 5 tecken med isLongerThanFive. De två funktionerna kombineras med andThen() för sekventiell bearbetning.

Metod compose()

Metoden compose() möjliggör att kombinera funktioner, men i omvänd ordning: den andra funktionen tillämpas först, och resultatet skickas sedan till den första funktionen.

Exempel

Du har en sträng och vill först beräkna dess längd och sedan lägga till ett prefix till resultatet.

Main.java

Main.java

copy
123456789101112131415161718
package 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 } }

I det här exemplet beräknas först längdensträngen med hjälp av stringLength, och sedan skickas resultatet vidare till funktionen addPrefix, som lägger till ett prefix. Du använder compose() för att tillämpa funktionerna i önskad ordning.

Metod identity()

Metoden identity() returnerar en funktion som helt enkelt returnerar sitt argument utan några ändringar. Detta är användbart när du behöver skicka en funktion som inte ändrar indatavärdet men krävs för att uppfylla gränssnittet.

Exempel

Föreställ dig att du behöver bearbeta en lista med användarnamn genom att tillämpa flera transformationer: en för att konvertera namnen till versaler, en annan för att lägga till suffixet "User", och en tredje med funktionen identity() för att lämna namnet oförändrat. Uppgiften är att tillämpa dessa funktioner på varje namn i listan samtidigt som programmets gränssnitt hålls konsekvent för varje transformation.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132
package 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); } } }

Som du kan se består utdata av tre formaterade listor med användarnamn. Den sista listan innehåller de ursprungliga namnen, vilket är där metoden identity() är användbar, eftersom den gör det möjligt att returnera namnen utan att lägga till extra logik för att hantera oförändrade värden. Detta gör koden renare och mer effektiv genom att direkt använda identity() när ingen transformation behövs.

1. Vad gör metoden andThen() i gränssnittet Function?

2. Vad blir resultatet när metoden identity() används?

3. Vad gör metoden compose()?

question mark

Vad gör metoden andThen() i gränssnittet Function?

Select the correct answer

question mark

Vad blir resultatet när metoden identity() används?

Select the correct answer

question mark

Vad gör metoden compose()?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 6
some-alt