Join and Split Arrays and Collections in Java – 在Java中加入和拆分数组和集合

最后修改: 2016年 12月 12日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this quick tutorial, we’ll learn how to join and to split Arrays and Collections in Java, making good use of the new stream support.

在这个快速教程中,我们将学习如何在Java中连接和分割数组集合,充分利用新的流支持

2. Join Two Arrays

2.连接两个数组

Let’s start by joining two Arrays together using Stream.concat:

让我们开始使用Stream.concat将两个Arrays连接起来:。

@Test
public void whenJoiningTwoArrays_thenJoined() {
    String[] animals1 = new String[] { "Dog", "Cat" };
    String[] animals2 = new String[] { "Bird", "Cow" };
    
    String[] result = Stream.concat(
      Arrays.stream(animals1), Arrays.stream(animals2)).toArray(String[]::new);

    assertArrayEquals(result, new String[] { "Dog", "Cat", "Bird", "Cow" });
}

3. Join Two Collections

3.加入两个收藏品

Let’s do the same join with two Collections:

让我们用两个集合做同样的连接:

@Test
public void whenJoiningTwoCollections_thenJoined() {
    Collection<String> collection1 = Arrays.asList("Dog", "Cat");
    Collection<String> collection2 = Arrays.asList("Bird", "Cow", "Moose");
    
    Collection<String> result = Stream.concat(
      collection1.stream(), collection2.stream())
      .collect(Collectors.toList());

    assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow", "Moose")));
}

4. Join Two Collections With Filter

4.用过滤器连接两个集合体

Now, let’s join two Collections of numbers filtering anything greater than 10:

现在,让我们把两个过滤大于10的数字的集合连接起来。

@Test
public void whenJoiningTwoCollectionsWithFilter_thenJoined() {
    Collection<String> collection1 = Arrays.asList("Dog", "Cat");
    Collection<String> collection2 = Arrays.asList("Bird", "Cow", "Moose");
    
    Collection<String> result = Stream.concat(
      collection1.stream(), collection2.stream())
      .filter(e -> e.length() == 3)
      .collect(Collectors.toList());

    assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Cow")));
}

5. Join an Array Into a String

5.将一个数组加入到一个字符串

Next, let’s join an Array into a String using a Collector:

接下来,让我们用一个收集器将一个数组连接成字符串

@Test
public void whenConvertArrayToString_thenConverted() {
    String[] animals = new String[] { "Dog", "Cat", "Bird", "Cow" };
    String result = Arrays.stream(animals).collect(Collectors.joining(", "));

    assertEquals(result, "Dog, Cat, Bird, Cow");
}

6. Join a Collection Into a String

6.将一个集合加入到一个字符串

Let’s do the same but with a Collection:

让我们做同样的事情,但要用一个Collection

@Test
public void whenConvertCollectionToString_thenConverted() {
    Collection<String> animals = Arrays.asList("Dog", "Cat", "Bird", "Cow");
    String result = animals.stream().collect(Collectors.joining(", "));

    assertEquals(result, "Dog, Cat, Bird, Cow");
}

7. Join a Map Into a String

7.将一个Map加入一个String

Next, let’s create a String out of a Map.

接下来,让我们从一个Map中创建一个String

The process is very similar to previous examples, but here we have an extra step to first join each Map Entry:

这个过程与之前的例子非常相似,但在这里我们有一个额外的步骤,首先加入每个Map Entry

@Test
public void whenConvertMapToString_thenConverted() {
    Map<Integer, String> animals = new HashMap<>();
    animals.put(1, "Dog");
    animals.put(2, "Cat");
    animals.put(3, "Cow");

    String result = animals.entrySet().stream()
      .map(entry -> entry.getKey() + " = " + entry.getValue())
      .collect(Collectors.joining(", "));

    assertEquals(result, "1 = Dog, 2 = Cat, 3 = Cow");
}

8. Join Nested Collections Into a String

8.将嵌套的集合加入一个字符串

Let’s do something a bit more complex. Let’s join some nested Collections into a String.

让我们做一些更复杂的事情。让我们把一些嵌套的集合连接成一个字符串

In the following example we first join within each nested Collection and then we join the result of each of them:

在下面的例子中,我们首先在每个嵌套的集合中进行连接,然后连接每个集合的结果。

@Test
public void whenConvertNestedCollectionToString_thenConverted() {
    Collection<List<String>> nested = new ArrayList<>();
    nested.add(Arrays.asList("Dog", "Cat"));
    nested.add(Arrays.asList("Cow", "Pig"));

    String result = nested.stream().map(
      nextList -> nextList.stream()
        .collect(Collectors.joining("-")))
      .collect(Collectors.joining("; "));

    assertEquals(result, "Dog-Cat; Cow-Pig");
}

9. Handle Null Values When Joining

9.连接时处理Null

Lest’s see how we can use a Filter to skip any null values:

让我们看看我们如何使用Filter 来跳过任何null值。

@Test
public void whenConvertCollectionToStringAndSkipNull_thenConverted() {
    Collection<String> animals = Arrays.asList("Dog", "Cat", null, "Moose");
    String result = animals.stream()
      .filter(Objects::nonNull)
      .collect(Collectors.joining(", "));

    assertEquals(result, "Dog, Cat, Moose");
}

10. Split a Collection in Two

10.将一个集合一分为二

Let’s split a Collection of numbers into two Collections at the middle:

让我们把一个数字的集合分成两个集合在中间。

@Test
public void whenSplitCollectionHalf_thenConverted() {
    Collection<String> animals = Arrays.asList(
        "Dog", "Cat", "Cow", "Bird", "Moose", "Pig");
    Collection<String> result1 = new ArrayList<>();
    Collection<String> result2 = new ArrayList<>();
    AtomicInteger count = new AtomicInteger();
    int midpoint = Math.round(animals.size() / 2);

    animals.forEach(next -> {
        int index = count.getAndIncrement();
        if (index < midpoint) {
            result1.add(next);
        } else {
            result2.add(next);
        }
    });

    assertTrue(result1.equals(Arrays.asList("Dog", "Cat", "Cow")));
    assertTrue(result2.equals(Arrays.asList("Bird", "Moose", "Pig")));
}

11. Split an Array by Word Length

11.按字长分割数组

Next, let’s split an array by the length of the words:

接下来,让我们按照单词的长度来分割一个数组。

@Test
public void whenSplitArrayByWordLength_thenConverted() {
    String[] animals = new String[] { "Dog", "Cat", "Bird", "Cow", "Pig", "Moose"};
    Map<Integer, List<String>> result = Arrays.stream(animals)
      .collect(Collectors.groupingBy(String::length));

    assertTrue(result.get(3).equals(Arrays.asList("Dog", "Cat", "Cow", "Pig")));
    assertTrue(result.get(4).equals(Arrays.asList("Bird")));
    assertTrue(result.get(5).equals(Arrays.asList("Moose")));
}

12. Split a String Into an Array

12.将一个字符串分割成一个数组

Let’s now do the opposite, let’s split a String into an Array:

现在让我们做相反的事情,让我们把一个字符串分割成一个数组:

@Test
public void whenConvertStringToArray_thenConverted() {
    String animals = "Dog, Cat, Bird, Cow";
    String[] result = animals.split(", ");

    assertArrayEquals(result, new String[] { "Dog", "Cat", "Bird", "Cow" });
}

13. Split String Into a Collection

13.将字符串分割成集合

This example is similar to the previous one, there is just an extra step to convert from Array to a Collection:

这个例子与前面的例子类似,只是多了一个步骤,从数组转换为集合

@Test
public void whenConvertStringToCollection_thenConverted() {
    String animals = "Dog, Cat, Bird, Cow";
    Collection<String> result = Arrays.asList(animals.split(", "));

    assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow")));
}

14. Split a String Into a Map

14.将一个字符串分割成一个地图

Now, let’s create a Map from a String. We will need to split our string twice, once for each entry, and one last time for the key and values:

现在,让我们从一个字符串中创建一个Map。我们将需要对我们的字符串进行两次分割,一次用于每个条目,最后一次用于键和值。

@Test
public void whenConvertStringToMap_thenConverted() {
    String animals = "1 = Dog, 2 = Cat, 3 = Bird";

    Map<Integer, String> result = Arrays.stream(
      animals.split(", ")).map(next -> next.split(" = "))
      .collect(Collectors.toMap(entry -> Integer.parseInt(entry[0]), entry -> entry[1]));

    assertEquals(result.get(1), "Dog");
    assertEquals(result.get(2), "Cat");
    assertEquals(result.get(3), "Bird");
}

15. Split String With Multiple Separators

15.用多个分隔符分割字符串W

Finally, let’s split a String that has multiple separators using a regular expression, we will also remove any empty results:

最后,让我们用正则表达式分割一个有多个分隔符的字符串,我们还将删除任何空的结果。

@Test
public void whenConvertCollectionToStringMultipleSeparators_thenConverted() {
    String animals = "Dog. , Cat, Bird. Cow";

    Collection<String> result = Arrays.stream(animals.split("[,|.]"))
      .map(String::trim)
      .filter(next -> !next.isEmpty())
      .collect(Collectors.toList());

    assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow")));
}

16. Conclusion

16.结论

In this tutorial, leveraging the simple String.split function and the powerful Java 8 Stream, we illustrated how to join and split Arrays and Collections.

在本教程中,利用简单的String.split函数和强大的Java 8 Stream,我们说明了如何连接和分割ArraysCollection。

You can find the code for this article over on GitHub.

你可以在GitHub上找到这篇文章的代码over