[英]Sum of list size in sub sub stream
我有以下结构:
class A {
List<B> bs;
}
class B {
List<C> cs;
}
class C {
List something.
}
我有List
的A
类,我要进去的所有元素的SUMM something
名单。 我尝试执行以下操作:
totalCount = as
.stream()
.map(a -> a.getBs()
.stream()
.mapToInt(b -> b.getSomething().size())
.sum());
但这不能编译。 我的错误在哪里?
编译错误为: Error:(61, 21) java: incompatible types: no instance(s) of type variable(s) R exist so that java.util.stream.Stream<R> conforms to java.lang.Integer
获得此结果的方法有很多,一种可能的方法是仅对所有内容进行平整并计算结果:
A a = ..;
a.bs.stream()
.flatMap(aa -> aa.cs.stream())
.flatMap(bb -> bb.something.stream())
.count();
让我们上一节课,为什么嵌套流是一个糟糕的主意。
您具有映射功能:
Function<A, Integer> func = a -> a.getBs().stream()
.mapToInt(b -> b.getSomething().size())
.sum();
将其放入您的初始流中,您将获得:
totalCount = as
.stream()
.map(func);
除非totalCount
是Stream<Integer>
,否则它将不会编译。
这不是其他的那么短,但是至少它具有测试代码来验证它的工作原理。
public class NewMain {
public static void main(String[] args) {
List<A> as = getAlist();
int totalCount = as
.stream()
.map(a -> a.getBs())
.collect(Collectors.summingInt(bs -> bs.stream()
.map(b -> b.cs)
.collect(Collectors.summingInt(cs -> cs.stream()
.map(c -> c.something)
.collect(Collectors.summingInt(s -> s.size()))))));
System.out.println(totalCount);
}
private static List<A> getAlist() {
List<A> all = new ArrayList<>();
for (int k = 0; k < 10; k++) {
A a = new A();
for (int j = 0; j < 10; j++) {
B b = new B();
for (int i = 0; i < 10; i++) {
C c = new C();
c.something = Arrays.asList(1, 2, 3, 4);
b.cs.add(c);
}
a.bs.add(b);
}
all.add(a);
}
return all;
}
static class A {
List<B> bs = new ArrayList<>();
private List<B> getBs() {
return bs;
}
}
static class B {
List<C> cs = new ArrayList<>();
}
static class C {
List something;
List getSomething() {
return something;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.