假设我们有以下代码
private List<String> convertScreenTypeToString(List<ScreenType> screenTypeList){
List<String> result = new ArrayList<>();
for(ScreenType screenType : screenTypeList){
result.add(screenType.getLabel());
}
return result;
}
但是,我们得到了不同的Type(ScreenType,HomeType,UserType),我不想重复相同的方法3次以上,并且我不能使用继承,因为它们是Providen模型。 (拱形设计素材)。
还
.... TypeToScreen(List<Object> whatever){}
这不是适当的解决方案。
此外:
private class Convert<T>{ .....TypeToScreen(List<T> whatecer){}}
在父类中可以,但是我正在寻找一些高级方法
答案 0 :(得分:1)
通过流,您可以映射列表的元素。
List<String> labels =
screenTypes.stream()
.map(ScreenType::getLabel)
.collect(Collectors.toList());
无法保证List
是哪种类型,因此您可能需要使用new ArrayList<>()
或类似的文字进行包装。
如果List
上有类似这样的方法,这很方便。您可以为这种非常常见的情况编写一种方便的方法。
public static <T, R> List<R> map(
List<T> source, Function<? super T, ? extends R> mapping
) {
return
screenTypes.stream()
.map(mapping)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
}
这里,Stream.collect
的三参数形式消除了对中间List
的需要。评论中的@Ousmane D.提供了替代的最后一行。
.collect(Collectors.toCollection(ArrayList::new));
或者,您可以不使用流将其写出。如果您对其中任何一件事情都感兴趣,这将更快,更容易阅读。
public static <T, R> List<R> map(
List<T> source, Function<? super T, ? extends R> mapping
) {
List<R> result = new ArrayList<>(source.size());
for (T t : source) {
result.add(mapping.apply(t));
}
return result;
}