我希望能够转换任何List<>到对象列表[] - 即给定列表的每个元素都应该以给定的方式转换为对象数组。
例如,我有
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>)
你能给我什么建议?
答案 0 :(得分:1)
class Transformer {
private List<?> content;
private Function<?, Object[]> mapper;
你真的不能使用这样的通配符。你真的需要写一些看起来像
的东西class Transformer<T> {
private List<T> content;
private Function<T, Object[]> mapper;
...虽然它的价值,使用像你在这里使用的Object[]
是一种严肃的设计气味。