这是我的问题,
我有一个List< A> lista1,我应该做的是:
map< key,List< A>> m = groupby(lista1);
m = lista.stream.collect(Collectors.groupingBy);
对于每个组,返回一个具有某些条件的元素,并创建一个新列表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;
列表与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
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;
是否可以将所有内容放在一个流中?或者以流方式执行第4步?
提前致谢
答案 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());
}