使用 Java Faker 生成独特的随机邮政编码

Generate unique random zip codes with Java Faker

我正在使用 Java Faker 并希望生成一系列唯一的随机邮政编码。 Python 和 Ruby 支持 unique 关键字。但我不知道如何在 Java 中完成这项工作。是否支持此功能?

这是 Java 代码:

// Not guaranteed to be unique
String zipCode = faker.address().zipCode()

Python example:

import faker
fake = faker.Faker()
number = fake.unique.random_int()

Ruby example:

# This will return a unique name every time it is called
Faker::Name.unique.name

查看源代码(您链接到的),unique 似乎不受 Java 实现的支持,因此您需要自己维护它。使用 java.util.Set<String>:

非常简单
Set<String> zipCodes = new Set<>();
...
String zipCode;
do {
    zipCode = faker.address().zipCode();
} while (zipCodes.contains(zipCode));
zipCodes.add(zipCode);
...

这可能比本机实现慢 - 或者不慢 - 但它会满足您的需求。

使用 Stream.generate() is a great way to generate values. To use it, define a Supplier 将提供源值的 lambda。在这种情况下,邮政编码。

var zipCodesStream = Stream.generate(() -> faker.address().zipCode());

使用 distinct() 使值唯一。

var zipCodesStream = Stream.generate(() -> faker.address().zipCode())
        .distinct();

可以使用 limit.

获取任意数量的值
var zipCodes = zipCodesStream
    .limit(10_000)
    .collect(Collectors.toList());

请务必使用limit,否则将永远停止收集。还要注意,如果源没有足够的不同值,那么进程将挂起!

有关更强大的实现,请参阅 Kotlin's Sequences


完整 (jdk11) 示例:

import com.github.javafaker.Faker;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class scratch {
  
  public static void main(String[] args) {

    // use a Thread local random, just in case we're multi-threading
    var random = ThreadLocalRandom.current();
    // use the random in the Faker, for consistency
    var faker = Faker.instance(random);

    // generate a Stream - the source values are from Faker
    var zipCodesStream =
        Stream.generate(() -> faker.address().zipCode())
            // make the generated values are distinct
            .distinct();

    var startMillis = System.currentTimeMillis();

    // grab 10k values, put them into a list
    var zipCodes = zipCodesStream
        .limit(10_000)
        .collect(Collectors.toList());
    var elapsedMillis = System.currentTimeMillis() - startMillis;

    // verify the generated values are distinct
    assert zipCodes.size() == Set.copyOf(zipCodes).size()
        : "Expect zipCodes has no duplicates";

    System.out.println("Generated " + zipCodes.size() + " distinct zip codes in "
        + elapsedMillis + "ms");
  }

}

输出:

Generated 10000 distinct zip codes in 387ms