我有一个ArrayList<Fileline>并且在Fileline内部有一个函数

public Double getValue() {
    ...
    doing stuff
    ...
    return value;
}


我想做的是返回3个文件行的任何非零countgetValue()

假设我有List<Fileline> filelinesfilelines.size() = 12并且它们各自的getValue()0,0,0, 0,1,2, 0,3,0, 4,5,5,那么我想要的result是3,所有这些都有效,期望第一组。

如果它是1个文件行的组,则可以这样filtercount

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/

10-10 02:24