2016-12-16 7 views
2

異なるタイプの2つのリストの共通部分と共通部分を取得したいとします。私はこれを行う最も簡単な方法だと思うので、私はJava 8ストリームを使用しようとしています。今まで私は毎回失敗しました。私は簡単に再現できるようにコードを単純化しました。例えばJava 8ストリームが交差し、カスタムオブジェクトの2つの異なるリストの和集合

:私は、2つのオブジェクト、データ1とデータ2を持っている

public class Data2 { 

private int id; 
private String name; 
private String type; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getType() { 
    return type; 
} 

public void setType(String type) { 
    this.type = type; 
} 

public Data2(int id, String name, String type) { 

    this.id = id; 
    this.name = name; 
    this.type = type; 
    } 

} 




public class Data1 { 

private int id; 
private String name; 
private int amount; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getAmount() { 
    return amount; 
} 

public void setAmount(int amount) { 
    this.amount = amount; 
} 

public Data1(int id, String name, int amount) { 

    this.id = id; 
    this.name = name; 
    this.amount = amount; 
} 

} 



public class OutputData { 

private int id; 
private String name; 
private String type; 
private int amount; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getType() { 
    return type; 
} 

public void setType(String type) { 
    this.type = type; 
} 

public int getAmount() { 
    return amount; 
} 

public void setAmount(int amount) { 
    this.amount = amount; 
} 

public OutputData(int id, String name, String type, int amount) { 

    this.id = id; 
    this.name = name; 
    this.type = type; 
    this.amount = amount; 
} 

} 

彼らは同様のフィールドを持っている..私はID(交差)に基づいてそれらを交差し、出力に保存する必要があります(組合?)タイプOutputDataの。主なタイプの例:

List<Data2> listOfData2 = new ArrayList<Data2>(); 

    listOfData2.add(new Data2(10501, "JOE" , "Type1")); 
    listOfData2.add(new Data2(10603, "SAL" , "Type5")); 
    listOfData2.add(new Data2(40514, "PETER", "Type4")); 
    listOfData2.add(new Data2(59562, "JIM" , "Type2")); 
    listOfData2.add(new Data2(29415, "BOB" , "Type1")); 
    listOfData2.add(new Data2(61812, "JOE" , "Type9")); 
    listOfData2.add(new Data2(98432, "JOE" , "Type7")); 
    listOfData2.add(new Data2(62556, "JEFF" , "Type1")); 
    listOfData2.add(new Data2(10599, "TOM" , "Type4")); 


List<Data1> listOfData1 = new ArrayList<Data1>(); 

    listOfData1.add(new Data1(10501, "JOE" ,3000000)); 
    listOfData1.add(new Data1(10603, "SAL" ,6225000)); 
    listOfData1.add(new Data1(40514, "PETER" ,2005000)); 
    listOfData1.add(new Data1(59562, "JIM" ,3000000)); 
    listOfData1.add(new Data1(29415, "BOB" ,3000000)); 

ここでは、エラーの無い成功とたくさんの、これで私の最高の試みの一つである:

List<OutputData> od = listOfData1.stream().flatMap(x -> listOfData2.stream().filter(y -> x.getId().equals(y.getId())).map(y -> new OutputData(x.getId(), x.getName(), y.getType(), x.getAmount())).collect(Collectors.toList())); 

これは、ID 10603の一つのエントリを持つリストを返す必要があります、名前SAL、その他のフィールドにはすべて入力されます。

+0

Guavaを使用していますか? – shmosel

+0

私はそうではありませんが、私はそれを開いています – gd000

答えて

4

を。

List<OutputData> result = listOfData1.stream() 
     .flatMap(x -> listOfData2.stream() 
       .filter(y -> x.getId() == y.getId()) 
       .map(y -> new OutputData(y.getId(), x.getName(), y.getType(), x.getAmount()))) 
     .collect(Collectors.toList()); 
+0

私のテストケースが間違っていたことを知りました。私はこれを試してみるつもりです – gd000

+0

WOW !!ありがとうございました! – gd000

+0

ようこそ。 :) –

0

私はあなたにいくつかの擬似コードあげる:これはそれを行う必要がありますが、一例では、同じIDを持つ各リストの5つのレコードがある

declare list 3 (type data3) 

for i = length of list 1 
    for j = length of list 2 
    if list1[i].getid == list2[j].getid 
     new data3 object with all relevant fields 
     add to list 3 
+0

偽のコードをありがとう。私はそれを定期的なループで問題なく行うことができます。私はJava 8ストリームを使用してそれをやりたかった – gd000

+0

問題はありません。私はなぜあなたが必要以上に複雑な解決策を使用していたのだろうと思っていました。乾杯! – Eric

関連する問題