我有一个ArrayList<Fileline>
和一个Fileline
内的函数
public Double getValue() {
...
doing stuff
...
return value;
}
我要做的是返回一组3个文件行中任何非零count
的{{1}}。
假设我getValue()
为List<Fileline> filelines
且filelines.size() = 12
getValue()
0,0,0, 0,1,2, 0,3,0, 4,5,5
为result
,那么我想要的filter
为3,一切都有效期待第一组。
如果它是1个文件行的组,我可以count
和long resultCount = filelines.stream().filter(x -> x.getValue() > 0).count();
这样:
{{1}}
,但它是由3人组成的事实导致我的问题。
将列表拆分为多个3元素子列表的最佳方法还是更优雅的方法?
答案 0 :(得分:2)
您可以将索引范围映射到子列表,如下所示:
List<Fileline> filtered = IntStream.range(0, list.size()/3)
.mapToObj(n -> list.subList(n*3, n*3+3))
.filter(subList -> subList.stream().anyMatch(fl -> fl.getValue() != 0.0))
.flatMap(List::stream)
.collect(Collectors.toList());
我假设您要将组扁平化,所以我添加了flatMap
步骤。或者,如果在您的情况下更好,则可以将它们分组:
List<List<Fileline>> filtered = IntStream.range(0, list.size()/3)
.mapToObj(n -> list.subList(n*3, n*3+3))
.filter(subList -> subList.stream().anyMatch(fl -> fl.getValue() != 0.0))
.collect(Collectors.toList());
如果您只需要计算此类群组,请将collect
步骤替换为count
,并将地图和过滤器合并为一步:
long count = IntStream.range(0, list.size()/3)
.filter(n -> list.subList(n*3, n*3+3).stream().anyMatch(fl -> fl.getValue() != 0.0))
.count();