Java 8:如何使用lambda将列表转换为列表

Luc*_*s T 7 java lambda java-8

我正在尝试将列表拆分为列表,其中每个列表的最大大小为4.

我想知道如何使用lambdas做到这一点.

目前我正在这样做的方式如下:

List<List<Object>> listOfList = new ArrayList<>();

final int MAX_ROW_LENGTH = 4;
int startIndex =0;
while(startIndex <= listToSplit.size() )    
{
    int endIndex = ( ( startIndex+MAX_ROW_LENGTH ) <  listToSplit.size() ) ? startIndex+MAX_ROW_LENGTH : listToSplit.size();
    listOfList.add(new ArrayList<>(listToSplit.subList(startIndex, endIndex)));
    startIndex = startIndex+MAX_ROW_LENGTH;
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

似乎没有一种简单的方法可以使用lambdas来拆分列表.虽然所有的答案都非常受欢迎,但它们也是lambdas不简化事物的一个很好的例子.

Jot*_*orn 5

如果你真的需要一个 lambda ,可以这样做。否则以前的答案更好。

    List<List<Object>> lists = new ArrayList<>();
    AtomicInteger counter = new AtomicInteger();
    final int MAX_ROW_LENGTH = 4;
    listToSplit.forEach(pO -> {
        if(counter.getAndIncrement() % MAX_ROW_LENGTH == 0) {
            lists.add(new ArrayList<>());
        }
        lists.get(lists.size()-1).add(pO);
    });
Run Code Online (Sandbox Code Playgroud)


ale*_*x.b 5

试试这种方法:

static <T> List<List<T>> listSplitter(List<T> incoming, int size) {
    // add validation if needed
    return incoming.stream()
            .collect(Collector.of(
                    ArrayList::new,
                    (accumulator, item) -> {
                        if(accumulator.isEmpty()) {
                            accumulator.add(new ArrayList<>(singletonList(item)));
                        } else {
                            List<T> last = accumulator.get(accumulator.size() - 1);
                            if(last.size() == size) {
                                accumulator.add(new ArrayList<>(singletonList(item)));
                            } else {
                                last.add(item);
                            }
                        }
                    },
                    (li1, li2) -> {
                        li1.addAll(li2);
                        return li1;
                    }
            ));
}
System.out.println(
        listSplitter(
                Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
                4
        )
);
Run Code Online (Sandbox Code Playgroud)

另请注意,此代码可以进行优化,而不是:

new ArrayList<>(Collections.singletonList(item))
Run Code Online (Sandbox Code Playgroud)

使用这个:

List<List<T>> newList = new ArrayList<>(size);
newList.add(item);
return newList;
Run Code Online (Sandbox Code Playgroud)