Converting a List to a String with all the values of the List comma separated in Java 8 is really straightforward. Let’s have a look how to do that.
在Java 8中将集合List转变为用逗号分隔的String是非常简单的,下面让我看看如何做到
In Java 8
We can simply write String.join(..), pass a delimiter and an Iterable and the new StringJoiner will do the rest:
我们使用String.join()函数,给函数传递一个分隔符合一个迭代器,一个StringJoiner对象会帮助我们完成所有的事情
List<String> cities = Arrays.asList("Milan",
"London",
"New York",
"San Francisco");
String citiesCommaSeparated = String.join(",", cities);
System.out.println(citiesCommaSeparated);
//Output: Milan,London,New York,San Francisco
If we are working with stream we can write as follow and still have the same result:
如果我们采用流的方式来写,就像下面这样,仍然能够得到同样的结果
String citiesCommaSeparated = cities.stream()
.collect(Collectors.joining(","));
System.out.println(citiesCommaSeparated);
//Output: Milan,London,New York,San Francisco
Note: you can statically import java.util.stream.Collectors.joining if you prefer just typing "joining".
In Java 7
For old times’ sake, let’s have a look at the Java 7 implementation:
由于老的缘故,让我们看看在java 7中如何实现这个功能
private static final String SEPARATOR = ",";
public static void main(String[] args) {
List<String> cities = Arrays.asList(
"Milan",
"London",
"New York",
"San Francisco");
StringBuilder csvBuilder = new StringBuilder();
for(String city : cities){
csvBuilder.append(city);
csvBuilder.append(SEPARATOR);
}
String csv = csvBuilder.toString();
System.out.println(csv);
//OUTPUT: Milan,London,New York,San Francisco,
//Remove last comma
csv = csv.substring(0, csv.length() - SEPARATOR.length());
System.out.println(csv);
//OUTPUT: Milan,London,New York,San Francisco
}
As you can see it’s much more verbose and easier to make mistakes like forgetting to remove the last comma. You can implement this in several ways—for example by moving the logic that removes the last comma to inside the for-loop—but no implementation will be so explicative and easy to understand as the declarative solution expressed in Java 8.
正如你所看到的,这种方式更加啰嗦并且更加容易犯诸如忘记去除最后一个逗号之类的错误。你能够采用几种方式来完成这一功能-例如你可以将删除最后一个逗号的操作逻辑放到for循环中,但是没有一种实现方式向java 8中如此可解释性并且容易理解
Focus should be on what you want to do—joining a List of String—not on how.
注意力应该放到你想做什么-连接List结合,而不是怎样做
Java 8: Manipulate String Before Joining
If you are using Stream, it’s really straightforward manipulate your String as you prefer by using map() or cutting some String out by using filter(). I’ll cover those topics in future articles. Meanwhile, this a straightforward example on how to transform the whole String to upper-case before joining.
Java 8: 在连接之前操作字符串
如果你使用流,使用map函数或者用于删掉一些字符串的filter函数能够更加直观的操作字符串。我在将来的文章中会覆盖这些主题。同时,这也是一个直观展示如何将整个字符串在连接之前转为大写的例子。
Java 8: From List to Upper-Case String Comma Separated
将List集合转为大写的用逗号分隔的String
String citiesCommaSeparated = cities.stream()
.map(String::toUpperCase)
.collect(Collectors.joining(","));
//Output: MILAN,LONDON,NEW YORK,SAN FRANCISCO
If you want to find out more about stream, I strongly suggest this cool video from Venkat Subramaniam.
Let’s Play
The best way to learn is playing! Copy this class with all the implementations discussed and play with that. There is already a small test for each of them.
让我们尝试一下。最好的学习方式是动手尝试。复制下面讨论的全部实现的类并且运行它。其中对于每一个实现几乎都有一个小的测试。
package net.reversecoding.examples;
import static java.util.stream.Collectors.joining;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
public class CsvUtil {
private static final String SEPARATOR = ",";
public static String toCsv(List<String> listToConvert){
return String.join(SEPARATOR, listToConvert);
}
@Test
public void toCsv_csvFromListOfString(){
List<String> cities = Arrays.asList(
"Milan", "London", "New York", "San Francisco");
String expected = "Milan,London,New York,San Francisco";
assertEquals(expected, toCsv(cities));
}
public static String toCsvStream(List<String> listToConvert){
return listToConvert.stream()
.collect(joining(SEPARATOR));
}
@Test
public void toCsvStream_csvFromListOfString(){
List<String> cities = Arrays.asList(
"Milan", "London", "New York", "San Francisco");
String expected = "Milan,London,New York,San Francisco";
assertEquals(expected, toCsv(cities));
}
public static String toCsvJava7(List<String> listToConvert){
StringBuilder csvBuilder = new StringBuilder();
for(String s : listToConvert){
csvBuilder.append(s);
csvBuilder.append(SEPARATOR);
}
String csv = csvBuilder.toString();
//Remove last separator
if(csv.endsWith(SEPARATOR)){
csv = csv.substring(0, csv.length() - SEPARATOR.length());
}
return csv;
}
@Test
public void toCsvJava7_csvFromListOfString(){
List<String> cities = Arrays.asList(
"Milan", "London", "New York", "San Francisco");
String expected = "Milan,London,New York,San Francisco";
assertEquals(expected, toCsvJava7(cities));
}
public static String toUpperCaseCsv(List<String> listToConvert){
return listToConvert.stream()
.map(String::toUpperCase)
.collect(joining(SEPARATOR));
}
@Test
public void toUpperCaseCsv_upperCaseCsvFromListOfString(){
List<String> cities = Arrays.asList(
"Milan", "London", "New York", "San Francisco");
String expected = "MILAN,LONDON,NEW YORK,SAN FRANCISCO";
assertEquals(expected, toUpperCaseCsv(cities));
}
}