Java List,按3的组计算Object的非零属性

时间:2015-07-14 15:29:27

标签: java arraylist collections filter java-stream

我有一个ArrayList<Fileline>和一个Fileline内的函数

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

我要做的是返回一组3个文件行中任何非零count的{​​{1}}。

假设我getValue()List<Fileline> filelinesfilelines.size() = 12 getValue() 0,0,0, 0,1,2, 0,3,0, 4,5,5result,那么我想要的filter为3,一切都有效期待第一组。

如果它是1个文件行的组,我可以countlong resultCount = filelines.stream().filter(x -> x.getValue() > 0).count(); 这样:

{{1}}

,但它是由3人组成的事实导致我的问题。

将列表拆分为多个3元素子列表的最佳方法还是更优雅的方法?

1 个答案:

答案 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();