class _Arrays {

    @Nullable
    public static <T, R> R[] map(
            @Nullable T[] array, 
            @NonNull Class<R> resultElementType, 
            @NonNull Function<T, R> mapper) {
        
        if (array == null) {
            return null;
        }
        val mappedArray = _Casts.<R[]>uncheckedCast(
                Array.newInstance(resultElementType, array.length));
        int i = 0;
        for (val element : array) {
            mappedArray[i++] = mapper.apply(element);
        }
        return mappedArray;
    }

}