2016-10-11 47 views
0


這裏是我的問題, 我有一個List < A> lista1,是我應該做的是:如何使用流應用多個過濾器和轉換到一個列表

  1. 地圖<關鍵,List < A >> m = groupby(lista1);

    m = lista.stream.collect(Collectors.groupingBy); 
    
  2. 對於每個組,返回一個元件與一些條件,並且使新列表列表< A> lista2 = MakeListfromGroup(米)

    List<A> lista2; 
    for (Map.Entry<key, List<A>> entry : m.entrySet()) { 
        A theOne; 
        for (A a : entry.getValue()) { 
         if(condition){ 
          theOne = a; 
         } 
        } 
        lista2.add(theOne); 
    } 
    return lista2; 
    
  3. 列表< B> listb1 = makeListB (lista2); //這裏,我不能使用stream.map.collect

    List<Integer> b1Key; 
    List<Integer> b2Key; 
    for(A a : lista2){ 
        b1key.add(a.b1key); 
        b2key.add(a.b2key); 
    } 
    mapb1 = gerfromBD(b1key); 
    mapb2 = gerfromBD(b2key); 
    List<B> listb1; 
    for(A a : lista2){ 
        listb1.add(new B(mapb1.get(a.b1key),mapb2.get(a.b2key)); 
    } 
    return listb1 
    
  4. B已經構件B1 B1和B2 B2,創建一個新的列表< B> listb2 = applyFilter(列表<謂詞< B1 >>,列表<謂語< B2 >>)

    List<B> listb2; 
    nextb: 
    for(B b : listb1){ 
        for(Predicate p: filtreB1){ 
         if(!p.accept(b.b1)){ 
          continue nextb; 
         } 
        } 
        for(Predicate p: filtreB2){ 
         if(!p.accept(b.b2)){ 
          continue nextb; 
         } 
        } 
        listb2.add(b); 
    } 
    return listb2; 
    

是否有可能把所有在一個流?或者以流的方式執行第4步?

在此先感謝

+0

對於第3步,你爲什麼不能使用流.map.collect? – Ash

+0

你寫了什麼代碼?這將有助於看到更多 – Ash

+0

我需要從數據庫中獲取一些數據來構建B.所以我不能一個接一個地做。 – liumin

回答

0

對於接下來的問題,請提供真實的代碼,而不是不完整,錯別字纏身的僞代碼。


,因爲你需要的A S表示步驟3中的完整列表,你必須收集從步驟2中的任何潛在流成一個列表反正。步驟2和4可以通過使用流,雖然可以簡化爲:

public static List<A> makeListfromGroup(Map<Object, List<A>> m, Predicate<A> condition) 
{ 
    return m.values() 
      .stream() 
      .map(as -> as.stream().filter(condition).findAny().orElse(null)) 
      .filter(Objects::nonNull) 
      .collect(Collectors.toList()); 
} 

步驟4,您可以瞭解如何在一次here應用多個條件:

public static List<B> applyFilter(List<B> list, List<Predicate<B1>> filtreB1, List<Predicate<B2>> filtreB2) 
{ 
    return list.stream() 
       .filter(b -> filtreB1.stream().allMatch(p -> p.test(b.getB1()))) 
       .filter(b -> filtreB2.stream().allMatch(p -> p.test(b.getB2()))) 
       .collect(Collectors.toList()); 
} 
相關問題