1 使用场景
String集合快速转化为指定分隔符分割的字符串;最后一个元素后面无分隔符;
1.1 java8前
@Test
public void test() {
//分隔符
final String SEPARATOR = ",";
List<String> cities = Arrays.asList("Milan", "London", "New York", "San Francisco");
StringBuilder csvBuilder = new StringBuilder();
//拼接 除最后一个字符
for (int i = 0; i < cities.size() - 1; i++) {
csvBuilder.append(cities.get(i)).append(SEPARATOR);
}
//拼接最后一个
csvBuilder.append(cities.get(cities.size() - 1));
//Milan,London,New York,San Francisco
System.out.println(csvBuilder.toString());
}
@Test
public void test() {
//分隔符
final String SEPARATOR = ",";
List<String> cities = Arrays.asList("Milan", "London", "New York", "San Francisco");
StringBuilder csvBuilder = new StringBuilder();
for (String city : cities) {
csvBuilder.append(city).append(SEPARATOR);
}
String csv = csvBuilder.toString();
//Milan,London,New York,San Francisco,
System.out.println(csv);
//字符串最后也有分隔符 需要删除
csv = csv.substring(0, csv.length() - SEPARATOR.length());
//Milan,London,New York,San Francisco
System.out.println(csv);
}
1.2 java8后
String.join 可以简化代码
@Test
public void test() {
//分隔符
final String SEPARATOR = ",";
List<String> cities = Arrays.asList("Milan", "London", "New York", "San Francisco");
String joinStr = String.join(SEPARATOR, cities);
//Milan,London,New York,San Francisco
System.out.println(joinStr);
}
采用java8的Stream api实现前面效果
@Test
public void test() {
//分隔符
final String SEPARATOR = ",";
List<String> cities = Arrays.asList("Milan", "London", "New York", "San Francisco");
String joinStr = cities.stream().collect(Collectors.joining(SEPARATOR));
//Milan,London,New York,San Francisco
System.out.println(joinStr);
}
2 官方文档
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
static String |
join(CharSequence delimiter, CharSequence... elements)
Returns a new String composed of copies of the |
static String |
join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
Returns a new |
//java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...)
public static String join(CharSequence delimiter, CharSequence... elements) {
//java.lang.String#join(java.lang.CharSequence, java.lang.Iterable<? extends java.lang.CharSequence>)
public static String join(CharSequence delimiter,
Iterable<? extends CharSequence> elements) {
@Test
public void testJoin(){
String message = String.join("-", "Java", "is", "cool");
// message returned is: "Java-is-cool"
System.out.println(message);
}
@Test
public void testJoin() {
List<String> strings = new LinkedList<>();
strings.add("Java");
strings.add("is");
strings.add("cool");
String message = String.join(" ", strings);
//message returned is: "Java is cool"
System.out.println(message);
String strMessage = strings.stream().collect(Collectors.joining(" "));
//Java is cool
System.out.println(strMessage);
}
@Test
public void testJoin(){
Set<String> strings = new LinkedHashSet<>();
strings.add("Java");
strings.add("is");
strings.add("very");
strings.add("cool");
String message = String.join("-", strings);
//message returned is: "Java-is-very-cool"
System.out.println(message);
}
3 CharSequence接口
String.join传入的参数或者迭代器需要实现CharSequence接口;当前们传入的参数未实现CharSequence接口或者集合的迭代器未实现CharSequence接口程序是会报错的 Xxx cannot be cast to java.lang.CharSequence
//java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...)
public static String join(CharSequence delimiter, CharSequence... elements) {
//java.lang.String#join(java.lang.CharSequence, java.lang.Iterable<? extends java.lang.CharSequence>)
public static String join(CharSequence delimiter,
Iterable<? extends CharSequence> elements) {
//public final class Integer extends Number implements Comparable<Integer> {
@Test
public void test() {
//分隔符
final String SEPARATOR = ",";
List<Integer> cities = Arrays.asList(1,2,3,4,5,6);
//需要强转不然编译器就报错
//java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.CharSequence
String joinStr = String.join(SEPARATOR, (CharSequence) cities);
}
CharSequence是一个描述字符串结构的接口,在这个接口里面一般有三种常用的子类
// Stirng类
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
// StringBuffer类
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
// StirngBuilder类
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
https://docs.oracle.com/javase/8/docs/api/java/lang/CharSequence.html
Modifier and Type | Method and Description |
---|---|
char |
charAt(int index)
Returns the |
default IntStream |
chars()
Returns a stream of |
default IntStream |
codePoints()
Returns a stream of code point values from this sequence. |
int |
length()
Returns the length of this character sequence. |
CharSequence |
subSequence(int start, int end)
Returns a |
String |
toString()
Returns a string containing the characters in this sequence in the same order as this sequence. |
package java.lang;
public interface CharSequence {
//
int length();
//
char charAt(int index);
//
CharSequence subSequence(int start, int end);
//
public String toString();
//
public default IntStream chars() {...}
public default IntStream codePoints() {...}
}
@Test
public void test() {
CharSequence str = "hello world";
//11
System.out.println(str.length());
//h
System.out.println(str.charAt(0));
//world
System.out.println(str.subSequence(6, 11));
//hello world
System.out.println(str.toString());
//104 101 108 108 111 32 119 111 114 108 100
str.chars().forEach((item) -> {
System.out.print(item + " ");
});
System.out.println();
//104 101 108 108 111 32 119 111 114 108 100
str.codePoints().forEach((item) -> {
System.out.print(item + " ");
});
}