簡體   English   中英

使用java 8流過濾2個數組復合對象元素

[英]Filtering 2 array composite object elements using java 8 stream

我有2個數組對象,第一個是復合對象,另一個是一個簡單的對象數組,根據找到匹配的一些比較,創建一個新的列表。 這將是基於條件的過濾列表。 我使用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;
}

我試圖在流中轉換數組,然后使用過濾器,但不知何故無法比較兩個不同的元素,即:

  1. accountOid[i]accountOid陣列(簡單陣列)
  2. accts[j].getAccountOid()AccountHoldCompisiteObj陣列(合成陣列)

我想你的目標是將內部for-loop轉換for-loop外部for-loop 實際上,您所做的只是將從每個AccountHoldCompositeObject接收的ObjectId對象與一組預定義的String OID作為要比較的ObjectId的模板進行比較。 .clone()

在進入Stream之前,我建議首先准備數據,以便流暢和簡單地操作和使用。 你想要的最后一個是在lambda中執行復雜的轉換。 做:

  1. 定義已轉換的OID( String to ObjectId )的集合Set<ObjectId>
  2. 迭代列表並搜索預定義的Set<ObjectId>可用OID的列表。
  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

有很多for循環,我添加了如下的新代碼。 我評論了一些線路,以了解那里發生的事情。

public static void main(String[] args) {

        final List<AccountHoldCompositeObj> accts = prepare();
        Set<ObjectId> setOfAccountObjectId = IntStream.range(1, 8) //Int stream range between 1-8
                .map(str -> new ObjectId(str)) // Create ObjectId
                .collect(Collectors.toSet()); // Collect into Set

        accts.stream()                                          // Stream for AccountHoldComposite array
                .filter(acct -> setOfAccountObjectId.contains(acct.getAccountOid()))   // Filter elements by existing ids
                .collect(Collectors.toList())
                .forEach(System.out::println);
    }

    private static List<AccountHoldCompositeObj> prepare() {
        int k = 10;
        //creating AccountHoldCompositeObj elements between 0-50
        return Stream.iterate(0, m -> m + 1)
                .limit(50)
                .map(currentId -> {
                    AccountHoldCompositeObj create = new AccountHoldCompositeObj();
                    create.setAccountId(Integer.toString(k));//some more elements
                    create.setAccountOid(new ObjectId(currentId));
                    return create;
                })
                .collect(Collectors.toList());

    }

編輯:我為你的for loop添加了Stream.iterate ,介於0 and 50之間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM