我有一个ArrayList<Fileline>
并且在Fileline
内部有一个函数
public Double getValue() {
...
doing stuff
...
return value;
}
我想做的是返回3个文件行的任何非零
count
的getValue()
。假设我有
List<Fileline> filelines
个filelines.size() = 12
并且它们各自的getValue()
是0,0,0, 0,1,2, 0,3,0, 4,5,5
,那么我想要的result
是3,所有这些都有效,期望第一组。如果它是1个文件行的组,则可以这样
filter
和count
:long resultCount = filelines.stream().filter(x -> x.getValue() > 0).count();
,但按3组一组的事实导致我出现问题。
将列表分为三个元素子列表的最佳方法是更优雅的方法?
最佳答案
您可以按以下三种方式将索引范围映射到子列表:
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();
关于java - Java列表,按3组一组计算对象的非零属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31410964/