隐秘列表的最快方法 到列表

问题描述 投票:0回答:1

想象我们有以下代码

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){}}

在父类里面可以,但是我正在寻找一些高级方法

java list collections add
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.