在Java中展平嵌套集合

2023/06/07

1. 概述

在这篇简短的文章中,我们将探讨如何在Java中展平嵌套集合。

2. 嵌套集合示例

假设我们有一个String类型列表的列表。

List<List<String>> nestedList = asList(
    asList("one:one"), 
    asList("two:one", "two:two", "two:three"), 
    asList("three:one", "three:two", "three:three", "three:four"));

3. 使用forEach扁平化列表

为了将这个嵌套集合展平为字符串列表,我们可以将forEach与Java 8方法引用一起使用:

public <T> List<T> flattenListOfListsImperatively(
    List<List<T>> nestedList) {
    List<T> ls = new ArrayList<>();
    nestedList.forEach(ls::addAll);
    return ls;
}

下面你可以看到方法的行为:

@Test
public void givenNestedList_thenFlattenImperatively() {
    List<String> ls = flattenListOfListsImperatively(nestedList);
    
    assertNotNull(ls);
    assertTrue(ls.size() == 8);
    assertThat(ls, IsIterableContainingInOrder.contains(
        "one:one",
        "two:one", "two:two", "two:three", "three:one",
        "three:two", "three:three", "three:four"));
}

4. 使用flatMap扁平化列表

我们还可以通过使用Stream API中的flatMap方法来展平嵌套列表。

这允许我们展平嵌套的Stream结构并最终将所有元素收集到一个特定的集合中:

public <T> List<T> flattenListOfListsStream(List<List<T>> list) {
    return list.stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toList());    
}

这是实际操作的逻辑:

@Test
public void givenNestedList_thenFlattenFunctionally() {
    List<String> ls = flattenListOfListsStream(nestedList);
    
    assertNotNull(ls);
    assertTrue(ls.size() == 8);
}

5. 总结

Java 8中的简单forEach或flatMap方法与方法引用相结合,可用于展平嵌套集合。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章