如何使用流应用多个过滤器并转换为List

时间:2016-10-11 12:38:54

标签: java-8 java-stream


这是我的问题, 我有一个List< A> lista1,我应该做的是:

  1. map< key,List< A>> m = groupby(lista1);

    m = lista.stream.collect(Collectors.groupingBy);
    
  2. 对于每个组,返回一个具有某些条件的元素,并创建一个新列表List< A> lista2 = MakeListfromGroup(m)

    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. 列表与LT; 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,创建新列表&lt; B&gt; listb2 = applyFilter(list&lt; predicate&lt; B1&gt;&gt;,list&lt; predicate&lt; B2&gt;&gt;)

    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;
    
  5. 是否可以将所有内容放在一个流中?或者以流方式执行第4步?

    提前致谢

1 个答案:

答案 0 :(得分:1)

对于下一个问题,请提供真实代码而不是不完整的拼写错误的伪代码。

当您需要第3步的A的完整列表时,您必须将步骤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());
}