Supplier: Datan Generointi
Pyyhkäise näyttääksesi valikon
Näin toteutetaan Supplier-funktionaalinen rajapinta:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
get()-metodin keskeinen tehtävä on palauttaa olio tyyppiä T ilman, että se ottaa vastaan parametreja.
Supplierin käytännön soveltaminen
Supplier-rajapintaa käytetään usein tilanteissa, joissa data täytyy luoda tarpeen mukaan. Tämä on hyödyllistä esimerkiksi laiskan alustuksen, satunnaisarvojen generoinnin tai arvojen hakemisen ulkoisesta lähteestä yhteydessä.
Luodaan järjestelmä, joka generoi satunnaisia salasanoja. Käyttämällä Supplier-funktionaalista rajapintaa voidaan helposti järjestää salasanojen generointi pyynnöstä.
Main.java
123456789101112131415161718192021222324package com.example; import java.util.Random; import java.util.function.Supplier; public class Main { public static void main(String[] args) { // Supplier for generating random passwords Supplier<String> passwordSupplier = () -> { String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"; StringBuilder password = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 12; i++) { int index = random.nextInt(characters.length()); password.append(characters.charAt(index)); } return password.toString(); }; // Generate and print the random password String generatedPassword = passwordSupplier.get(); System.out.println("Generated password: " + generatedPassword); } }
Luodaan Supplier, joka tuottaa satunnaisen salasanan ja jonka pituus on 12 merkkiä. Supplier-rajapinnan sisällä oleva lambda-lauseke käyttää Random-luokkaa valitakseen satunnaisia merkkejä merkkijonosta.
get()-metodi käynnistää tämän salasanan generointilogiikan vain tarvittaessa, mahdollistaen arvojen laiskan generoinnin.
Laiska generointi
Aluksi luodaan Supplier, mutta sen sisällä oleva koodi ei suoritu välittömästi. Tämä on tärkeä ominaisuus. Sen sijaan, että suoritettaisiin jokin logiikka heti (esim. salasanan generointi), tallennetaan se Supplier-olioon ohjeena, joka suoritetaan myöhemmin tarvittaessa.
Supplier<String> passwordSupplier = () -> {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()";
StringBuilder password = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 12; i++) {
int index = random.nextInt(characters.length());
password.append(characters.charAt(index));
}
return password.toString();
};
Tässä Supplier-rajapinnan sisällä oleva koodi (salasanan generointi) ei suoriteta välittömästi. Sen sijaan määritellään, "Kun joku pyytää, näin salasana generoidaan." Nyt, kun kutsut get()-metodia tälle Supplier:
String generatedPassword = passwordSupplier.get();
Vasta silloin Supplier-rajapinnan sisällä oleva koodi suoritetaan, ja salasana luodaan. Tämä on laiskaa suoritusta.
Keskeiset vastuualueet
1. Mitä Supplier-rajapinta tekee Javassa?
2. Mitä tapahtuu, jos kutsut get()-metodia kahdesti samalle Supplier-oliolle?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme