Javaの8ストリームを使用して2つのアレイ複合オブジェクト要素をフィルタリングします

ラケッシュ:

私は2つの配列オブジェクトを持って、最初のものが複合され、別の1が見つかりました。試合、新しいリストを作成した場合、いくつかの比較に基づいて、オブジェクトの単純な配列です。これは、条件に基づいてフィルタリングされたリストになります。私は使用してJavaやった1.7、これは以下のコードが使用して達成できることができるかどうかが指導を探して、バージョンをjava-8

ここでは、条件付きフィルタに基づく新しいリストを作成し、私のコードです

public static void main(String[] args) throws CloneNotSupportedException {
    String[] accountOid = {"1","2","3","4","5","6","7","8"};
    AccountHoldCompositeObj[] accts = prepare();
    ArrayList<AccountHoldCompositeObj> list = new ArrayList<AccountHoldCompositeObj>(); 
    for (int i = 0; i < accountOid.length; i++) {
        for (int j = 0; j < accts.length; j++) {
            ObjectId oid =  new ObjectId(accountOid[i]);
            if (oid.equals(accts[j].getAccountOid())) {
                AccountHoldCompositeObj anAccount = (AccountHoldCompositeObj) accts[j].clone();                 
                list.add(anAccount);
                break;
            }
        }
    } 

    list.stream().forEach(s->System.out.println(s));
}

private static AccountHoldCompositeObj[] prepare() {
    AccountHoldCompositeObj[] valArr = new AccountHoldCompositeObj[5];
    int k =10;
    for (int i=0;i<50;i++){         
        AccountHoldCompositeObj create = new AccountHoldCompositeObj(); 
        create.setAccountId(Integer.toString(k));//some more elements
        create.setAccountOid(new ObjectId(i)); 
        valArr[i] = create;
        k++;
    }
    return valArr;
}

私はつまり、ストリーム、次に使用されるフィルタに変換アレイに試みたが、何とか正確に2つの異なる要素を比較することができません。

  1. accountOid[i]accountOidアレイ(単純な配列)
  2. accts[j].getAccountOid()AccountHoldCompisiteObjアレイ(複合アレイ)
ニコラス:

私はあなたの目標は、内側を変換することであると仮定しfor-loop、外1で。実際には、あなたがすべてがの比較であるObjectIdのそれぞれから受信したオブジェクトAccountHoldCompositeObjectの定義済みのグループとStringするためのテンプレートとしてのOID ObjectId比較されます。.clone()必要とされていません。

ストリームIに入る前に、流暢かつ容易な操作と使用するための第1のデータを準備をお勧めします。あなたが望む最後はラムダの内部で複雑な変換を実行することです。行う:

  1. セットの定義Set<ObjectId>変換のOID(のStringのをObjectId)。
  2. 反復リスト定義済みで利用可能なOIDを持つものを検索しますSet<ObjectId>
  3. 所望の出力までの残りを集めます。

どうぞ:

Set<ObjectId> idSet = Arrays.stream(accountOid)             // Stream over String[]
                            .map(str -> new ObjectId(str))  // Create ObjectId from each
                            .collect(Collectors.toSet());   // Collect to Set<ObjectId>

List<AccountHoldCompositeObj> list = Arrays
    .stream(accts)                                          // Stream over AccountHoldCompositeObj[]
    .filter(acct -> idSet.contains(acct.getAccountOid()))   // Filter elements by IDs
    .collect(Collectors.toList());                          // Collect to List

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=188228&siteId=1