Java泛型:将List<TypeA>转换为List<TypeB>

这是一个基本问题,我想。然而,来自 C++ 这并不像我预期的那么容易。请考虑以下代码:

import java.util.ArrayList;
import java.util.List;

final class TestClass {

    public class Foo {
        int myInt;
        float myFloat;
    }

    public class Bar {
        int myInt;
        float myFloat;
    }

    private static Bar toBar(Foo in) {
        Bar out = new Bar();
        out.myInt = in.myInt;
        out.myFloat = in.myFloat;
        return out;
    }

    public static <InT, OutT> List<OutT> toBar(List<InT> in) {
        List<OutT> out = new ArrayList<>(in.size());
        for (InT inElement: in) {
            out.add(toBar(inElement));
        }
        return out;
    }
}

这给了我一个错误:“错误:没有找到适合 toBar(InT) 的方法”。

我有很多集合,需要从 转换List<TypeA1>List<TypeB1>List<TypeA2>List<TypeB2>。为了减少代码,我想在 Java 泛型中提取列表迭代,同时在具体实现中进行元素转换。任何想法,如何做到这一点?不幸的是,不允许使用第三方库。

非常感谢。

回答

您的static方法不会通过编译,因为toBar您调用的方法需要一个Foo参数,而不是一个可以是任何东西的泛型类型参数。

您不需要一种方法来进行转换。您可以使用相对较短的Stream管道实现相同的效果:

List<Foo> foos = ...
List<Bar> bars = foos.stream().map(TestClass::toBar).collect(Collectors.toList());

当然,如果必须的话,您可以将它包装在一个方法中,但是您必须传递一个Function告诉方法如何将第一个元素转换List为第二个元素的元素List

public static <InT, OutT> List<OutT> convert(List<InT> in, Function<InT,OutT> converter) {
    return in.stream().map(converter).collect(Collectors.toList());
}

你用它来称呼它:

List<Foo> foos = ...
List<Bar> bars = convert(foos,TestClass::toBar);


以上是Java泛型:将List&lt;TypeA&gt;转换为List&lt;TypeB&gt;的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>