Looking for java Answers? Try Ask4KnowledgeBase
Looking for java Keywords? Try Ask4Keywords

Java Language Génération de chaînes aléatoires à l'aide de flux


Exemple

Il est parfois utile de créer des Strings aléatoires, peut-être comme ID de session pour un service Web ou un mot de passe initial après l'inscription à une application. Cela peut être facilement réalisé en utilisant les Stream .

Nous devons d'abord initialiser un générateur de nombres aléatoires. Pour améliorer la sécurité des String générées, il est SecureRandom utiliser SecureRandom .

Remarque : la création d'un SecureRandom est assez onéreuse, il est donc SecureRandom de ne le faire qu'une seule fois et d'appeler de temps en temps l'une de ses méthodes setSeed() pour le réamorcer.

private static final SecureRandom rng = new SecureRandom(SecureRandom.generateSeed(20)); 
//20 Bytes as a seed is rather arbitrary, it is the number used in the JavaDoc example

Lors de la création de String aléatoires, nous souhaitons généralement qu'elles utilisent uniquement certains caractères (par exemple, uniquement des lettres et des chiffres). Nous pouvons donc créer une méthode renvoyant un boolean qui pourra ensuite être utilisé pour filtrer le Stream .

//returns true for all chars in 0-9, a-z and A-Z
boolean useThisCharacter(char c){
    //check for range to avoid using all unicode Letter (e.g. some chinese symbols)
    return c >= '0' && c <= 'z' && Character.isLetterOrDigit(c);
}

Ensuite, nous pouvons utiliser le RNG pour générer une chaîne aléatoire de longueur spécifique contenant le jeu de caractères qui passe notre vérification useThisCharacter .

public String generateRandomString(long length){
    //Since there is no native CharStream, we use an IntStream instead
    //and convert it to a Stream<Character> using mapToObj.
    //We need to specify the boundaries for the int values to ensure they can safely be cast to char
    Stream<Character> randomCharStream = rng.ints(Character.MIN_CODE_POINT, Character.MAX_CODE_POINT).mapToObj(i -> (char)i).filter(c -> this::useThisCharacter).limit(length);

    //now we can use this Stream to build a String utilizing the collect method.
    String randomString = randomCharStream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();
    return randomString;
}