首页 > 应用开发 > > 使用 Java Faker 生成随机数
原型开发好以后,通常需要一些展示数据。如果没有实际数据,怎样为 Java 程序生成一些有意义的随机数据?
我用过 UUID 和 ThreadLocalRandom 来生成随机数,但是能力有限,无法提供特定领域的随机数据。于是,我开始寻找更好的解决方案。最后找到了 Faker 这个好东西,幸运的是有 Java 版本:Java Faker。不仅使用方便,而且可以设置多个领域,几秒钟内生成需要的随机数。
1. Java Faker 上手
在 Maven项目中添加 Java Faker 依赖:
使用前,创建一个 Faker 对象:
Faker faker = new Faker();
Faker 方法调用时会随机访问底层数据,因此不需要每次都创建一个实例。Java Faker 通过 /src/main/resources 中的 .yml 获取数据。
使用 Faker 可以访问30多个不同的领域,为几乎每个用例创建随机数。可以使用流式 API 生成随机数:
String firstName = faker.name().firstName();
String appName = faker.app().name();
String foodIngredient = faker.food().ingredient();
包含的领域有:
金融
视频
书籍
姓名
地址
商务
…
此外还包含一些有趣的领域:
尤达
查克·诺里斯
哈利·波特
指环王
…
2. Java Faker 使用示例
为了演示 Java Faker,这里通过一个 REST API 返回随机数量的 person、book 和 food 对象。虽然示例采用了 Spring Boot 2.1 和 Java 11,但是其他版本也可以正常工作。
示例应用提供了不同的 Endpoint 获取随机数据:
@RestController
@RequestMapping("/random")
public class RandomDataEndpoint {
@Autowired
private ObjectMapper objectMapper;
@GetMapping("/persons")
public JsonNode getRandomPersons() {
Faker faker = new Faker();
ArrayNode persons = objectMapper.createArrayNode();
for (int i = 0; i < 10; i++) {
persons.add(objectMapper.createObjectNode()
.put("firstName", faker.name().firstName())
.put("lastName", faker.name().lastName())
.put("title", faker.name().title())
.put("suffix", faker.name().suffix())
.put("address", faker.address().streetAddress())
.put("city", faker.address().cityName())
.put("country", faker.address().country()));
}
return persons;
}
}
3. 返回本地化随机数据
随机数据的默认 locale 是 EN。此外,Faker 库还支持返回本地化随机数据。如果指定了 locale 请确保在开发库的支持列表中。可以检查对应的 .yml 文件确认已经有对应的英文版本。
如果指定的 locale 没有对应的翻译,比如 beers,默认会切换到英文。
Faker 构造函数参数默认为 locale:
Faker faker = new Faker(new Locale("de"));
上面的代码指定返回的随机数据为德语:
@GetMapping("/foods")
public JsonNode getRandomFoods() {
Faker faker = new Faker(new Locale("de"));
ArrayNode foods = objectMapper.createArrayNode();
for (int i = 0; i < 10; i++) {
foods.add(objectMapper.createObjectNode()
.put("ingredients" , faker.food().ingredient())
.put("spices", faker.food().spice())
.put("measurements", faker.food().measurement()));
}
return foods;
}
也可以设为列出的其他 locale:
@GetMapping("/books")
public JsonNode getRandomBook() {
Faker faker = new Faker(new Locale("en-US"));
ArrayNode books = objectMapper.createArrayNode();
for (int i = 0; i < 10; i++) {
books.add(objectMapper.createObjectNode()
.put("author", faker.book().author())
.put("genre", faker.book().genre())
.put("publisher", faker.book().publisher())
.put("title", faker.book().title()));
}
return books;
}
示例完整源代码可以在 GitHub 上找到。
github.com/rieckpil/blog-tutorials/tree/master/random-data-in-java-using-java-faker
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/832/viewspace-3163009/ ,如需转载,请注明出处,否则将追究法律责任。