java随机数方法的实现过程(使用JavaFaker)
原型开发好以后,通常需要一些展示数据。如果没有实际数据,怎样为 Java 程序生成一些有意义的随机数据?
我用过 UUID 和 ThreadLocalRandom 来生成随机数,但是能力有限,无法提供特定领域的随机数据。于是,我开始寻找更好的解决方案。最后找到了 Faker 这个好东西,幸运的是有 Java 版本:Java Faker。不仅使用方便,而且可以设置多个领域,几秒钟内生成需要的随机数。
1. Java Faker 上手
在 Maven项目中添加 Java Faker 依赖:
<dependency> <groupId>com.github.javafaker</groupId> <artifactId>javafaker</artifactId> <version>0.18</version> </dependency>
使用前,创建一个 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
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com