オブジェクトのリストは2つあります。 List<X>
およびList<Y>
。 X
とY
は、次のようなオブジェクトです。
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;
}
変換方法List<X>
into List<Y>
ルールに基づく:
一部のフィールドの値は等しくなければなりません。
例えば:
_List<Y>
、1つのオブジェクトYに対して、フィールドaの値は等しくなければなりません。
YのフィールドList<A>
、1つのオブジェクトAに対して、フィールドwの値は等しくなければなりません。
AのフィールドList<B>
、1つのオブジェクトBに対して、フィールドmの値は等しくなければなりません。
グアバにはこのメソッド Lists#transform がありますが、変換方法がわかりません。
または他の方法?
public static <F,T> List<T> transform(List<F> fromList,
Function<? super F,? extends T> function
Lists.transform() および Function のAPIドキュメントを読むこともできますが、基本的に変換の呼び出し元は、変換するFunction
オブジェクトを提供しますF
からT
へ。
たとえば、List<Integer> intList
があり、List<String>
を作成して、後者の各要素にその数値の英語表現が含まれる場合(1が「1」になるなど)にアクセスする場合 IntToEnglish thenなどのクラス
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>
に変換できます
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
これはどう?
import Java.util.ArrayList;
import Java.util.List;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
public class GuavaTransform {
public static void main(String[] args) {
List<X> xList = new ArrayList<X>();
xList.add(new X("a", "b", "v", "w", "m", "n"));
xList.add(new X("a1", "b1", "v1", "w1", "m1", "n1"));
for(X elem: xList) {
System.out.println("An instance of X:"+ elem);
}
System.out.println();
List<Y> yList = Lists.transform(xList, new TransformXY());
for(Y elem: yList) {
System.out.println("The corresponding instance of Y: \n"+elem);
}
}
}
class TransformXY implements Function<X, Y> {
@Override
public Y apply(X x) {
List<B> bList = new ArrayList<B>();
bList.add(new B(x.m, x.n));
List<A> aList = new ArrayList<A>();
aList.add(new A(x.v, x.w, bList));
return new Y(x.a, x.b, aList);
}
}
class X {
String a;
String b;
String v;
String w;
String m;
String n;
X(String a, String b, String v, String w, String m, String n) {
super();
this.a = a;
this.b = b;
this.v = v;
this.w = w;
this.m = m;
this.n = n;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("(");
sb.append(a+",");
sb.append(b+",");
sb.append(v+",");
sb.append(w+",");
sb.append(m+",");
sb.append(n);
sb.append(")");
return sb.toString();
}
}
class Y {
String a;
String b;
List<A> aList;
Y(String a, String b, List<A> aList) {
super();
this.a = a;
this.b = b;
this.aList = aList;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(a+"\n");
sb.append(b+"\n");
for(A elem: aList) {
sb.append(elem+"\n");
}
return sb.toString();
}
}
class A {
String v;
String w;
List<B> bList;
A(String v, String w, List<B> bList) {
super();
this.v = v;
this.w = w;
this.bList = bList;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("--------"+v+"\n");
sb.append("--------"+w+"\n");
for(B elem: bList) {
sb.append(elem+"\n");
}
return sb.toString();
}
}
class B {
String m;
String n;
B(String m, String n) {
super();
this.m = m;
this.n = n;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("----------------"+m+"\n");
sb.append("----------------"+n+"\n");
return sb.toString();
}
}
コンソール出力:
An instance of X:(a,b,v,w,m,n)
An instance of X:(a1,b1,v1,w1,m1,n1)
The corresponding instance of Y:
a
b
--------v
--------w
----------------m
----------------n
The corresponding instance of Y:
a1
b1
--------v1
--------w1
----------------m1
----------------n1
Java 8スタイル、IntelliJ IDEAは私を助けてくれました。
List<X> xList = new ArrayList<>();
List<Y> yList = xList
.stream()
.map(X::getY)
.collect(Collectors.toList());
@Isaaceと同じですが、ラムダ構文を使用します( この例 から取得):
List<X> xList = new ArrayList<>();
List<Y> yList = xList
.stream()
.map(n -> someTransformFunc(n))
.collect(Collectors.toList());
相互変換できる2つのオブジェクト、CoachとEntityBaseがあると仮定します
1.ジェネリックメソッドの宣言
public static <TSourse, TResult> void ToList(List<TSourse> list, List<TResult> results) {
if (list.size() > 0) {
for (TSourse obj : list) {
TResult tResult = (TResult) obj;
if (tResult == null) {
throw new AppException("error....");
}
results.add(tResult);
}
}
}
2.このメソッドを呼び出す
List<EntityBase> entityBaseList = new ArrayList<>();
Coach coach = new Coach();
coach.setId("123");
entityBaseList.add(coach);
List<Coach> coachList = new ArrayList<>();
ToList(entityBaseList, coachList);
//will complete List<AObj> to another List<BObj>