将任何List转换为List <object []> </object []>

时间:2014-10-21 18:12:35

标签: java collections java-8

我希望能够转换任何List&lt;&gt;到对象列表[] - 即给定列表的每个元素都应该以给定的方式转换为对象数组。

例如,我有

List<User> users = 
        Lists.newArrayList(new User((long) 1, "Name1"), new User ((long) 2, "Name2"));

和一个功能

Function <User, Object[]> mapper = 
                           user -> new Object[] {user.getUserId(), user.getUserName()}

我需要通过使用mapper转换每个用户来获取对象数组列表。但重点是编写函数,可以使用任何给定的列表和任何给定的映射器。

我创建了Transformer类并尝试以下一种方式实现我的目标,但是出现了编译错误:

class Transformer {    
    private List<?> content;
    private Function<?, Object[]> mapper; 
    //getters and setters
    ....
    public List<Object[]> transform() {
        return content.stream()
                      .map(mapper)   // this row isn't compiled
                      .collect(Collectors.toList());
    }
}



Error:(75, 45) java: method map in interface java.util.stream.Stream<T> cannot be applied to given types; 
required: java.util.function.Function<? super capture#1 of ?,? extends R> 
found: java.util.function.Function<capture#2 of ?,java.lang.Object[]> 
reason: cannot infer type-variable(s) R 
(argument mismatch; java.util.function.Function<capture#2 of ?,java.lang.Object[]> cannot be converted to java.util.function.Function<? super capture#1 of ?,? extends R>)

你能给我什么建议?

1 个答案:

答案 0 :(得分:1)

class Transformer {    
  private List<?> content;
  private Function<?, Object[]> mapper; 

你真的不能使用这样的通配符。你真的需要写一些看起来像

的东西
class Transformer<T> {
  private List<T> content;
  private Function<T, Object[]> mapper;

...虽然它的价值,使用像你在这里使用的Object[]是一种严肃的设计气味。