In a previous post I gave a way of generating random test mobile numbers (Ofcom approved!) using Scala iterators.
Now that Java 8 gives us lambdas and streams I thought I would see what those generators might look like in Java.
Here’s the mobile generator:
Supplier<String> mobileSupplier = () -> String.format("447700900%03d", ThreadLocalRandom.current().nextInt(999));Nice, still a one-liner.
Generating pseudo MAC addresses is a little bit more trouble. This supplier uses another nested stream to generate the random hex array.
Supplier<String> macSupplier = () -> ThreadLocalRandom.current().ints(6, 0, 255)
.mapToObj(i -> String.format("%02x", i))
.collect(Collectors.joining(":"));You use these Supplier functions with the static generate method of Stream. Because the generators create infinite streams we use limit to just get a few values. Eg:
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Generators {
private static final Supplier<String> mobileSupplier = () -> String.format("447700900%03d", ThreadLocalRandom.current().nextInt(999));
private static final Supplier<String> macSupplier = () -> ThreadLocalRandom.current().ints(6, 0, 255)
.mapToObj(i -> String.format("%02x", i))
.collect(Collectors.joining(":"));
public static void main(String[] args) {
System.out.println("Some mobile numbers:");
Stream.generate(Generators.mobileSupplier)
.limit(5)
.forEach(System.out::println);
System.out.println();
System.out.println("Some (pseudo) mac addresses:");
Stream.generate(Generators.macSupplier)
.limit(5)
.forEach(System.out::println);
}
}

Leave a Reply