1. 소개

List 변환 은 Java 개발자로서 매우 자주 수행하는 작업이므로 여전히 뜨거운 주제입니다. 이 사용방법(예제)에서는네 가지 다른 접근 방식을 사용하여 문자열 List쉼표로 구분된 문자열 로 변환하는 방법을 배웁니다.

2. 자바 8+ 사용하기

변환을 위해 Java 8부터 사용할 수 있는 세 가지 다른 클래스와 해당 메서드를 사용합니다.

다음 List을 다음 예제에 대한 입력으로 사용하겠습니다.

List<String> arraysAsList = Arrays.asList("ONE", "TWO", "THREE");

2.1.

먼저 String 처리 를 위한 많은 유틸리티가 있고 변환 메소드 join() 을 제공하는 String 클래스를 사용할 것입니다 .

String commaSeparatedString = String.join(",", arraysAsList);

assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE");

2.2. 스트링 조이너

둘째, CharSequence 구분 기호를 매개 변수로 허용하는 생성자가 있는 StringJoiner 클래스를 사용합니다.

StringJoiner stringJoiner = new StringJoiner(",");
arraysAsList.forEach(stringJoiner::add);
String commaSeparatedString = stringJoiner.toString();

assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE");

CharSequence 구분 기호, CharSequence 를 접두사로, 다른 하나를 접미사로 사용하는 또 다른 생성자가 있습니다 .

StringJoiner stringJoinerWithDelimiterPrefixSuffix = new StringJoiner(",", "[", "]");
arraysAsList.forEach(stringJoinerWithDelimiterPrefixSuffix::add);
String commaSeparatedStringWithDelimiterPrefixSuffix = stringJoinerWithDelimiterPrefixSuffix.toString();

assertThat(commaSeparatedStringWithDelimiterPrefixSuffix).isEqualTo("[ONE,TWO,THREE]");

2.3. 수집가

셋째, Collectors 클래스는 서명이 다른 다양한 유틸리티 및 Join() 메서드를 제공합니다.

먼저 CharSequence 구분 기호 를 입력으로 사용하는 Collectors.joining() 메서드 를 사용 하여 Stream collect() 메서드에 적용하는 방법을 살펴보겠습니다 . 

String commaSeparatedUsingCollect = arraysAsList.stream()
  .collect(Collectors.joining(","));

assertThat(commaSeparatedUsingCollect).isEqualTo("ONE,TWO,THREE");

다음 예제에서는 map() 메서드를 사용하여 List의 각 개체를 문자열 로 변환한 다음 collect()Collectors 메서드를 적용하는 방법을 볼 것 입니다. 합류() :

String commaSeparatedObjectToString = arraysAsList.stream()
  .map(Object::toString)
  .collect(Collectors.joining(","));

assertThat(commaSeparatedObjectToString).isEqualTo("ONE,TWO,THREE");

다음으로 map() 메서드를 사용하여 List 요소를 String 으로 변환한 다음 collect()Collectors.joining() 메서드를 적용합니다 .

String commaSeparatedStringValueOf = arraysAsList.stream()
  .map(String::valueOf)
  .collect(Collectors.joining(","));

assertThat(commaSeparatedStringValueOf).isEqualTo("ONE,TWO,THREE");

이제 위와 같이 map() 을 사용하고 Collectors를 사용합니다. CharSequence 구분 기호, 접두사로 CharSequence , 접미사로 CharSequence 를 입력하는 join() 메서드 :

String commaSeparatedStringValueOfWithDelimiterPrefixSuffix = arraysAsList.stream()
  .map(String::valueOf)
  .collect(Collectors.joining(",", "[", "]"));

assertThat(commaSeparatedStringValueOfWithDelimiterPrefixSuffix).isEqualTo("[ONE,TWO,THREE]");

마지막으로, collect() 대신 reduce() 메서드를 사용하여 List을 변환하는 방법을 살펴보겠습니다 .

String commaSeparatedUsingReduce = arraysAsList.stream()
  .reduce((x, y) -> x + "," + y)
  .get();

assertThat(commaSeparatedUsingReduce).isEqualTo("ONE,TWO,THREE");

3. Apache Commons Lang 사용하기

또는 Java 대신 Apache Commons Lang 라이브러리 에서 제공하는 유틸리티 클래스를 사용할 수도 있습니다 .

Apache의 StringUtils 클래스 를 사용하려면 pom.xml 파일에 의존성 을  추가해야 합니다 .

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.0</version>
</dependency>

join() 메서드에는 일련의 요소, 값의 Iterator , String 또는 char 와 같은 여러 형식의 구분 기호와 같은 입력을 허용하는 다양한 구현 이 있습니다 .

String commaSeparatedString = StringUtils.join(arraysAsList, ",");

assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE");

join() 에 전달된 정보 가 Object 의 배열인 경우 int 를 startIndex 로, int 를 endIndex 로 받습니다 .

String commaSeparatedStringIndex = StringUtils.join(arraysAsList.toArray(), ",", 0, 3);

assertThat(commaSeparatedStringIndex).isEqualTo("ONE,TWO,THREE");

4. 스프링 코어 사용하기

Spring Core 라이브러리는 유사하게 이러한 유형의 변환을 위한 메소드가 있는 유틸리티 클래스를 제공합니다.

먼저 Spring의 Core StringUtils 클래스 를 사용하기 위해 pom.xml 파일에 의존성 을  추가합니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.22</version>
</dependency>

Spring의 Core StringUtils 클래스는 기본 구분 기호로 쉼표를 사용하고 매개변수로 변환할 Collection 을 사용하는 collectionToCommaDelimitedString() 메서드를 제공합니다.

String collectionToCommaDelimitedString = StringUtils.collectionToCommaDelimitedString(arraysAsList);

assertThat(collectionToCommaDelimitedString).isEqualTo("ONE,TWO,THREE");

두 번째 메서드인 collectionToDelimitedString() 은 변환할 컬렉션 과 문자열 구분 기호 를 매개 변수로 사용합니다 .

String collectionToDelimitedString = StringUtils.collectionToDelimitedString(arraysAsList, ",");

assertThat(collectionToDelimitedString).isEqualTo("ONE,TWO,THREE");

5. 구글 구아바 사용하기

마지막으로 Google Guava 라이브러리를 사용합니다.

 Google의 Guava Joiner 클래스 를 사용하려면 pom.xml 파일에 의존성 을  추가해야 합니다 .

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
</dependency>

Google의 Guava Joiner 클래스는 결과적으로 적용할 수 있는 다양한 메서드를 제공합니다.

첫 번째 메서드는 구분자 매개변수로 String 을 취하는 on()이고 , 두 번째 메서드는 변환할 값이 있는 Iterable 을  매개변수로 취하는 join() 메서드입니다.

String commaSeparatedString = Joiner.on(",")
  .join(arraysAsList);

assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE");

다음 예를 위해 일부 null 값이 포함된 다른 List을 살펴보겠습니다 .

List<String> arraysAsListWithNull = Arrays.asList("ONE", null, "TWO", null, "THREE");

이를 감안할 때 on()join() 사이에 다른 메서드를 사용할 수 있으며 그 중 하나가 skipNulls() 메서드입니다. Iterable 내부에서 null 값 의 변환을 피하기 위해 사용할 수 있습니다 .

String commaSeparatedStringSkipNulls = Joiner.on(",")
  .skipNulls()
  .join(arraysAsListWithNull);

assertThat(commaSeparatedStringSkipNulls).isEqualTo("ONE,TWO,THREE");

또 다른 옵션은 useForNull() 을 사용하는 것입니다. 이 매개변수 는 String 값을 매개변수로 사용 하여 변환할 Iterable 내부의 null 값 을 대체합니다 .

String commaSeparatedStringUseForNull = Joiner.on(",")
  .useForNull(" ")
  .join(arraysAsListWithNull);

assertThat(commaSeparatedStringUseForNull).isEqualTo("ONE, ,TWO, ,THREE");

6. 결론

이 기사에서는 List of String 을 쉼표로 구분된 String 으로 변환하는 다양한 예를 보았습니다 . 마지막으로, 우리의 목적에 더 잘 맞는 라이브러리와 유틸리티 클래스를 선택하는 것은 우리에게 달려 있습니다.

항상 그렇듯이 이 기사의 전체 코드 샘플은 GitHub 에서 찾을 수 있습니다 .

Generic footer banner