Merge pull request #5568 from kag0/master

[#3062] Add support for conversion into Collection types
This commit is contained in:
Lukas Eder 2017-02-10 15:12:36 +01:00 committed by GitHub
commit 791f2b3539
2 changed files with 75 additions and 2 deletions

View File

@ -291,6 +291,10 @@ public final class Convert {
}
}
public static final <U> U[] convertCollection(Collection from, Class<? extends U[]> to){
return new ConvertAll<U[]>(to).from(from);
}
/**
* Convert an object to a type.
*
@ -499,16 +503,43 @@ public final class Convert {
}
}
else if (fromClass.isArray()) {
Object[] fromArray = (Object[]) from;
// [#3062] Default collections if no specific collection type was requested
if (Collection.class.isAssignableFrom(toClass) &&
toClass.isAssignableFrom(ArrayList.class)) {
return (U) new ArrayList(Arrays.asList(fromArray));
}
else if (Collection.class.isAssignableFrom(toClass) &&
toClass.isAssignableFrom(LinkedHashSet.class)) {
return (U) new LinkedHashSet(Arrays.asList(fromArray));
}
// [#3443] Conversion from Object[] to JDBC Array
if (toClass == java.sql.Array.class) {
return (U) new MockArray(null, (Object[]) from, fromClass);
return (U) new MockArray(null, fromArray, fromClass);
}
else {
return (U) convertArray((Object[]) from, toClass);
return (U) convertArray(fromArray, toClass);
}
}
else if (toClass.isArray()
&& Collection.class.isAssignableFrom(fromClass)){
Collection f = (Collection) from;
Class componentType = toClass.getComponentType();
Object[] dest = (Object[]) Array.newInstance(componentType, f.size());
Object[] list = f.stream()
.map(e -> {
if (!componentType.isAssignableFrom(e.getClass()))
return convert(e, componentType);
return e;
}).toArray();
System.arraycopy(list, 0, dest, 0, dest.length);
return (U) dest;
}
else if (toClass == Optional.class) {
return (U) Optional.of(from);

View File

@ -0,0 +1,42 @@
package org.jooq.tools;
import org.junit.Test;
import java.util.*;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by nfischer on 9/24/2016.
*/
public class ConvertTest {
@Test
public void testFromArray(){
String[] arr = new String[]{"Hello", "World", "!"};
List convertedList = Convert.convert(arr, List.class);
assertEquals(ArrayList.class, convertedList.getClass());
assertTrue(Arrays.equals(arr, convertedList.toArray()));
Set convertedSet = Convert.convert(arr, Set.class);
assertEquals(LinkedHashSet.class, convertedSet.getClass());
assertTrue(Arrays.equals(arr, convertedSet.toArray()));
}
@Test
public void testFromCollection(){
List<String> list = asList("Hello", "world", "!");
String[] arr = Convert.convertCollection(list, String[].class);
assertEquals(list, asList(arr));
String[] numStrings = new String[]{"1", "2", "3"};
List<Integer> integerList = asList(1, 2, 3);
String[] convertedNumString = Convert.convertCollection(integerList, String[].class);
assertTrue(Arrays.equals(numStrings, convertedNumString));
assertTrue(Arrays.equals(new String[0], Convert.convertCollection(new LinkedList<Integer>(), String[].class)));
}
}