### Question:
CrudUtils { @NonNull public static String toSnakeCase(@NonNull final String camelCaseString) { return Arrays.stream(splitCamelCase(camelCaseString)) .map(String::toLowerCase) .collect(Collectors.joining("_")); }  @NonNull static T copyNonNullProperties(@NonNull final S source, @NonNull final T target, String... ignoredProperties); @NonNull static String firstWordOf(@NonNull final String camelCaseString); @NonNull static String toSnakeCase(@NonNull final String camelCaseString); @NonNull static String[] splitCamelCase(@NonNull final String camelCaseString);  }### Answer:
@Test public void toSnakeCase() { assertThat(CrudUtils.toSnakeCase("SplitCamelCase")) .isEqualTo("split_camel_case"); assertThat(CrudUtils.toSnakeCase("10SplitCamelCase")) .isEqualTo("10_split_camel_case"); assertThat(CrudUtils.toSnakeCase("splitCamelCase")) .isEqualTo("split_camel_case"); }