diff --git a/src/main/java/net/datafaker/providers/base/Options.java b/src/main/java/net/datafaker/providers/base/Options.java index 50ef88dfe..4ab604167 100644 --- a/src/main/java/net/datafaker/providers/base/Options.java +++ b/src/main/java/net/datafaker/providers/base/Options.java @@ -1,5 +1,6 @@ package net.datafaker.providers.base; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -168,4 +169,19 @@ public E nextElement(E[] array) { public E nextElement(List list) { return list.get(faker.random().nextInt(list.size())); } + + /** + * Returns a random element from a collection. + * + * @param collection The collection to take a random element from. + * @param The type of the elements in the collection. + * @return A randomly selected element from the collection. + * @throws IllegalArgumentException if the collection is empty. + * @since 3.0.0 + */ + public E nextElement(Collection collection) throws IllegalArgumentException { + return collection.stream() + .skip(faker.random().nextInt(collection.size())) + .findFirst().orElseThrow(() -> new IllegalArgumentException("Collection is empty")); + } } diff --git a/src/test/java/net/datafaker/providers/base/OptionsTest.java b/src/test/java/net/datafaker/providers/base/OptionsTest.java index e4570d8d9..b117647a7 100644 --- a/src/test/java/net/datafaker/providers/base/OptionsTest.java +++ b/src/test/java/net/datafaker/providers/base/OptionsTest.java @@ -5,7 +5,9 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Collection; import java.util.List; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -119,6 +121,21 @@ void testNextListElement() { } } + @Test + void testNextCollectionElement() { + Collection collection = Set.of(1, 2, 3, 5, 8, 13, 21); + for (int i = 1; i < 10; i++) { + assertThat(opt.nextElement(collection)).isIn(collection); + } + } + + @Test + void testNextCollectionElementEmpty() { + Collection collection = Set.of(); + assertThatThrownBy(() -> opt.nextElement(collection)) + .isInstanceOf(IllegalArgumentException.class); + } + enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }