Java - 流 - 收集每个 N 个元素

2022-09-02 02:28:50

我正在尝试学习java - 流。我能够做简单的迭代/过滤/地图/收集等。

当我尝试收集每3个元素并打印时,如本例所示,[收集每3个元素并打印等等...]

    List<String> list = Arrays.asList("a","b","c","d","e","f","g","h","i","j");

    int count=0;
    String append="";
    for(String l: list){
        if(count>2){
            System.out.println(append);
            System.out.println("-------------------");
            append="";
            count=0;
        }
        append = append + l;
        count++;
    }
    System.out.println(append);

输出:

abc
-------------------
def
-------------------
ghi
-------------------
j

我没有得到任何线索如何使用流来做到这一点。我应该实现我自己的收集器来实现这一点吗?


答案 1

您实际上可以使用 来模拟列表的分页。IntStream

List<String> list = Arrays.asList("a","b","c","d","e","f","g","h","i","j");

int pageSize = 3;

IntStream.range(0, (list.size() + pageSize - 1) / pageSize)
        .mapToObj(i -> list.subList(i * pageSize, Math.min(pageSize * (i + 1), list.size())))
        .forEach(System.out::println);

其中输出:

[a, b, c]
[d, e, f]
[g, h, i]
[j]

如果要生成字符串,可以使用,因为您正在直接处理:String.joinList<String>

.mapToObj(i -> String.join("", list.subList(i * pageSize, Math.min(pageSize * (i + 1), list.size()))))

答案 2

如果您的项目中有番石榴,则可以使用方法:Iterables.partition

import com.google.common.collect.Iterables;
import com.google.common.collect.Streams;
...

Stream<List<String>> stream = Streams.stream(Iterables.partition(list, 3));

推荐