使用 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()
import faker
fake = faker.Faker()
number = fake.unique.random_int()
# 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
我正在使用 Java Faker 并希望生成一系列唯一的随机邮政编码。 Python 和 Ruby 支持 unique
关键字。但我不知道如何在 Java 中完成这项工作。是否支持此功能?
这是 Java 代码:
// Not guaranteed to be unique
String zipCode = faker.address().zipCode()
import faker
fake = faker.Faker()
number = fake.unique.random_int()
# 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