Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Funksjon: Datatransformasjon | Grunnleggende og Funksjonelle Egenskaper ved Stream API
Stream-API

bookFunksjon: Datatransformasjon

Mens Predicate hjelper oss med å evaluere boolske uttrykk, lar Function oss transformere data ved å bruke operasjoner som returnerer resultater basert på input.

Function brukes ofte til datatransformasjon, som typekonvertering, beregninger eller verdibehandling.

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

Grensesnittet Function<T, R> i Java representerer et funksjonelt grensesnitt som tar et argument av typen T og returnerer et resultat av typen R.

Metoden apply(T t) utfører datatransformasjon ved å ta inngangsverdien og returnere resultatet. Dette muliggjør opprettelse av fleksible funksjoner for å behandle data av ulike typer.

Praktisk anvendelse

Anta at du har en liste med brukernavn, og du trenger å beregne lengden på hvert navn for videre analyse eller databehandling.

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 dette eksempelet har du en liste med brukernavn. For hvert navn bruker du funksjonen nameLength, som beregner antall tegn i navnet ved hjelp av metoden length(). Ved å bruke metoden forEach itererer du over hvert element i listen og skriver ut en melding som viser hvor mange tegn hvert navn inneholder.

Kombinere funksjoner

Grensesnittet Function tilbyr flere metoder for å kombinere funksjoner, slik at du kan lage en kjede av operasjoner.

Metode andThen()

Metoden andThen() gjør det mulig å kombinere to funksjoner ved å først bruke én funksjon, og deretter sende resultatet videre til den andre funksjonen. Dette er nyttig når du trenger å utføre flere operasjoner i sekvens.

Eksempel

Du har en liste med brukernavn, og du skal gjøre den første bokstaven stor i hvert navn og deretter sjekke om navnet har mer enn 5 tegn.

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

Først gjør du den første bokstaven stor i hvert brukernavn ved å bruke capitalizeFirstLetter. Deretter sjekker du om det formaterte brukernavnet har mer enn 5 tegn ved å bruke isLongerThanFive. De to funksjonene kombineres med andThen() for sekvensiell behandling.

Metode compose()

Metoden compose() gjør det mulig å kombinere funksjoner, men i motsatt rekkefølge: den andre funksjonen brukes først, og resultatet sendes deretter inn i den første funksjonen.

Eksempel

Du har en streng, og du ønsker først å beregne lengden på den og deretter legge til et prefiks til 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 dette eksempelet beregner du først lengdenstrengen ved hjelp av stringLength, og deretter sendes resultatet til funksjonen addPrefix, som legger til et prefiks foran. Du bruker compose() for å anvende funksjonene i ønsket rekkefølge.

Metode identity()

Metoden identity() returnerer en funksjon som ganske enkelt returnerer sitt argument uten noen endringer. Dette er nyttig når du må sende inn en funksjon som ikke endrer inngangsverdien, men som kreves for å oppfylle grensesnittet.

Eksempel

Tenk deg at du skal behandle en liste med brukernavn ved å bruke flere transformasjoner: én for å konvertere navnene til store bokstaver, en annen for å legge til suffikset "User", og en tredje som bruker funksjonen identity() for å la navnet være uforandret. Oppgaven er å anvende disse funksjonene på hvert navn i listen, samtidig som programmets grensesnitt holdes konsistent for hver transformasjon.

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 utdataene av tre formaterte lister med brukernavn. Den siste listen inneholder de opprinnelige navnene, og det er her identity()-metoden er nyttig, siden den lar oss returnere navnene uten å legge til ekstra logikk for å håndtere uendrede verdier. Dette gjør koden renere og mer effektiv ved å bruke identity() direkte når ingen transformasjon er nødvendig.

1. Hva gjør andThen()-metoden i Function-grensesnittet?

2. Hva blir resultatet når man bruker identity()-metoden?

3. Hva gjør compose()-metoden?

question mark

Hva gjør andThen()-metoden i Function-grensesnittet?

Select the correct answer

question mark

Hva blir resultatet når man bruker identity()-metoden?

Select the correct answer

question mark

Hva gjør compose()-metoden?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 6

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Suggested prompts:

Can you give an example of how to use the Function interface in Java?

What is the difference between andThen() and compose() methods?

When should I use the identity() method in practice?

Awesome!

Completion rate improved to 2.33

bookFunksjon: Datatransformasjon

Sveip for å vise menyen

Mens Predicate hjelper oss med å evaluere boolske uttrykk, lar Function oss transformere data ved å bruke operasjoner som returnerer resultater basert på input.

Function brukes ofte til datatransformasjon, som typekonvertering, beregninger eller verdibehandling.

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

Grensesnittet Function<T, R> i Java representerer et funksjonelt grensesnitt som tar et argument av typen T og returnerer et resultat av typen R.

Metoden apply(T t) utfører datatransformasjon ved å ta inngangsverdien og returnere resultatet. Dette muliggjør opprettelse av fleksible funksjoner for å behandle data av ulike typer.

Praktisk anvendelse

Anta at du har en liste med brukernavn, og du trenger å beregne lengden på hvert navn for videre analyse eller databehandling.

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 dette eksempelet har du en liste med brukernavn. For hvert navn bruker du funksjonen nameLength, som beregner antall tegn i navnet ved hjelp av metoden length(). Ved å bruke metoden forEach itererer du over hvert element i listen og skriver ut en melding som viser hvor mange tegn hvert navn inneholder.

Kombinere funksjoner

Grensesnittet Function tilbyr flere metoder for å kombinere funksjoner, slik at du kan lage en kjede av operasjoner.

Metode andThen()

Metoden andThen() gjør det mulig å kombinere to funksjoner ved å først bruke én funksjon, og deretter sende resultatet videre til den andre funksjonen. Dette er nyttig når du trenger å utføre flere operasjoner i sekvens.

Eksempel

Du har en liste med brukernavn, og du skal gjøre den første bokstaven stor i hvert navn og deretter sjekke om navnet har mer enn 5 tegn.

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

Først gjør du den første bokstaven stor i hvert brukernavn ved å bruke capitalizeFirstLetter. Deretter sjekker du om det formaterte brukernavnet har mer enn 5 tegn ved å bruke isLongerThanFive. De to funksjonene kombineres med andThen() for sekvensiell behandling.

Metode compose()

Metoden compose() gjør det mulig å kombinere funksjoner, men i motsatt rekkefølge: den andre funksjonen brukes først, og resultatet sendes deretter inn i den første funksjonen.

Eksempel

Du har en streng, og du ønsker først å beregne lengden på den og deretter legge til et prefiks til 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 dette eksempelet beregner du først lengdenstrengen ved hjelp av stringLength, og deretter sendes resultatet til funksjonen addPrefix, som legger til et prefiks foran. Du bruker compose() for å anvende funksjonene i ønsket rekkefølge.

Metode identity()

Metoden identity() returnerer en funksjon som ganske enkelt returnerer sitt argument uten noen endringer. Dette er nyttig når du må sende inn en funksjon som ikke endrer inngangsverdien, men som kreves for å oppfylle grensesnittet.

Eksempel

Tenk deg at du skal behandle en liste med brukernavn ved å bruke flere transformasjoner: én for å konvertere navnene til store bokstaver, en annen for å legge til suffikset "User", og en tredje som bruker funksjonen identity() for å la navnet være uforandret. Oppgaven er å anvende disse funksjonene på hvert navn i listen, samtidig som programmets grensesnitt holdes konsistent for hver transformasjon.

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 utdataene av tre formaterte lister med brukernavn. Den siste listen inneholder de opprinnelige navnene, og det er her identity()-metoden er nyttig, siden den lar oss returnere navnene uten å legge til ekstra logikk for å håndtere uendrede verdier. Dette gjør koden renere og mer effektiv ved å bruke identity() direkte når ingen transformasjon er nødvendig.

1. Hva gjør andThen()-metoden i Function-grensesnittet?

2. Hva blir resultatet når man bruker identity()-metoden?

3. Hva gjør compose()-metoden?

question mark

Hva gjør andThen()-metoden i Function-grensesnittet?

Select the correct answer

question mark

Hva blir resultatet når man bruker identity()-metoden?

Select the correct answer

question mark

Hva gjør compose()-metoden?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 6
some-alt