如何将 List<X> 转换为另一个 List<Y>

2022-08-31 21:27:16

我有两个对象列表; 和。 并且是如下所示的省略项:List<X>List<Y>XY

public class X {
    String a;
    String b;
    String v;
    String w;
    String m;
    String n;
}

public class Y {
    String a;
    String b;
    List<A> aList;
}
public class A {
    String v;
    String w;
    List<B> bList;
}
public class B {
    String m;
    String n;
}

如何转换为基于规则:
某些字段的值必须相等。
例如:
在 中,对于一个对象 Y,字段 a 的值必须相等。
在 Y 的字段中,对于一个对象 A,字段 w 的值必须相等。
在 A 的字段中,对于一个对象 B,字段 m 的值必须相等,依此类推。List<X>List<Y>List<Y>List<A>List<B>

番石榴有这种方法,Lists#transform,但我不知道如何变换。

还是其他任何方式?


答案 1
public static <F,T> List<T> transform(List<F> fromList,
                                      Function<? super F,? extends T> function

您可能希望阅读 Lists.transform()Function 的 API 文档,但基本上转换的调用方提供了一个将 a 转换为 .FunctionFT

例如,如果你有一个,并且你想创建一个,使得后者的每个元素都包含该数字的英文表示(1变成“一”等),并且你可以访问一个类,如IntToEnglish,那么List<Integer> intListList<String>

Function<Integer, String> intToEnglish = 
    new Function<Integer,String>() { 
        public String apply(Integer i) { return new IntToEnglish().english_number(i); }
    };

List<String> wordsList = Lists.transform(intList, intToEnglish);

执行该转换。

您可以应用相同的模式来转换您的List<X>List<Y>


答案 2

使用 java lambda:

public static <K,V,Q extends K> List<V> transform( final List<Q> input, final java.util.function.Function<K,V> tfunc ) {
    if( null == input ) {
        return null;
    }
    return input.stream().map(tfunc).collect( Collectors.toList() );
}

你只需要实现:java.util.function.Function