使用 java、java 8、guava 和 apache commons 实现ArrayList 列表的拆分

x33g5p2x  于2022-09-15 转载在 Java  
字(2.4k)|赞(0)|评价(0)|浏览(404)

此示例将演示如何使用 java、java 8、guava 和 apache commons 对 ArrayList 进行分区。示例数据是一个字符串列表,这些字符串列表将按指定条件分解为多个子列表。

示例数据

List<String> playerDecisions = Lists.newArrayList(
            "Hit",
            "Stand",
            "Double down",
            "Split",
            "Surrender");

原生Java

此代码段将使用 for 循环将字符串列表拆分为子列表。

@Test
public void partition_list_java () {

    List<List<String>> decisionsBy2 = new ArrayList<List<String>>();

    final int sizeOfList = playerDecisions.size();
    final int breakApart = 2;

    for (int i = 0; i < sizeOfList; i += breakApart) {
        decisionsBy2.add(new ArrayList<String> (
            playerDecisions.subList(i, Math.min(sizeOfList, i + breakApart)))
        );
    }

    logger.info(decisionsBy2);

    assertThat(decisionsBy2.get(0), hasItems("Hit", "Stand"));
    assertThat(decisionsBy2.get(1), hasItems("Double down", "Split"));
    assertThat(decisionsBy2.get(2), hasItems("Surrender"));
}

输出

[
    [Hit, Stand],
    [Double down, Split],
    [Surrender]
]

Java 8

使用 java 8,该片段将展示如何使用分区函数。分区函数将返回 Map < Boolean,List < String >> ,其中键是布尔值,结果基于predicate的行为。由 lambda 表达式创建,如果字符串以 's' 开头,显示的predicate将返回 true。生成的映射将具有以“s”开头的字符串集合,其中键等于 true,而字符串列表不以“s”开头。所以最多你会有两个键或两个不同的组。这种返回集合类型类似于 guava multimap。

@Test
public void partition_list_java8() {

    Predicate<String> startWithS = p -> p.toLowerCase().startsWith("s");

    Map<Boolean, List<String>> decisionsByS = playerDecisions.stream()
            .collect(Collectors.partitioningBy(startWithS));

    logger.info(decisionsByS);

    assertTrue(decisionsByS.get(Boolean.TRUE).size() == 3);
}

输出

{false=[Hit, Double down], true=[Stand, Split, Surrender]}

Google Guava

该示例将展示如何使用 guava 将 ArrayList 拆分为更小的数组列表。 Guava 的 Lists 集合实用分区方法将返回列表的子列表,每个子列表的大小相同,最后一个大小取决于元素的数量。

@Test
public void partition_list_guava () {

    List<List<String>> decisionsBy2 = Lists.partition(playerDecisions, 2);

    logger.info(decisionsBy2);

    assertThat(decisionsBy2.get(0), hasItems("Hit", "Stand"));
    assertThat(decisionsBy2.get(1), hasItems("Double down", "Split"));
    assertThat(decisionsBy2.get(2), hasItems("Surrender"));
}

输出

[
    [Hit, Stand],
    [Double down, Split],
    [Surrender]
]

Apache Commons

此示例将展示如何使用 apache commons 将列表划分为多个列表。

@Ignore("Will be released in collections 4")
@Test
public void partition_list_apache_commons () {
    // TODO not yet released, collections 4
    // ListUtils.partition(playerDecisions, 2)
    // http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/ListUtils.html#partition(java.util.List, int)
}

相关文章

微信公众号

最新文章

更多