Java:将List <String>转换为一个String

JavaScript有Array.join()

 js>["Bill","Bob","Steve"].join(" and ") Bill and Bob and Steve 

Java有这样的东西吗? 我知道我可以用StringBuilder自己拼凑一些东西:

 static public String join(List<String> list, String conjunction) { StringBuilder sb = new StringBuilder(); boolean first = true; for (String item : list) { if (first) first = false; else sb.append(conjunction); sb.append(item); } return sb.toString(); } 

…但是如果像这样的东西已经是JDK的一部分的话,这样做没有意义。

使用Java 8,您可以在没有任何第三方库的情况下执行此操作

如果你想join一个string集合,你可以使用新的String.join()方法:

 List<String> list = Arrays.asList("foo", "bar", "baz"); String joined = String.join(" and ", list); // "foo and bar and baz" 

如果您使用的stringtypes不是string,则可以使用Stream API和正在join的收集器 :

 List<Person> list = Arrays.asList( new Person("John", "Smith"), new Person("Anna", "Martinez"), new Person("Paul", "Watson ") ); String joinedFirstNames = list.stream() .map(Person::getFirstName) .collect(Collectors.joining(", ")); // "John, Anna, Paul" 

StringJoiner类也可能是有用的。

所有对Apache Commons的引用都没有问题(这是大多数人使用的),但我认为与Guava相同的Joiner有更好的API。

你可以用简单的连接大小写

 Joiner.on(" and ").join(names) 

也容易处理空值:

 Joiner.on(" and ").skipNulls().join(names); 

要么

 Joiner.on(" and ").useForNull("[unknown]").join(names); 

和(就我所关心的而言,使用它优先于commons-lang就足够了),处理地图的能力:

 Map<String, Integer> ages = .....; String foo = Joiner.on(", ").withKeyValueSeparator(" is ").join(ages); // Outputs: // Bill is 25, Joe is 30, Betty is 35 

这对于debugging非常有用

不是开箱即用,但许多图书馆都有类似的情况:

Commons Lang:

 org.apache.commons.lang.StringUtils.join(list, conjunction); 

弹簧:

 org.springframework.util.StringUtils.collectionToDelimitedString(list, conjunction); 

Android上,您可以使用TextUtils类。

 TextUtils.join(" and ", names); 

不,在标准Java API中没有这种方便的方法。

毫不奇怪,Apache Commons 在他们的StringUtils类中提供了这样的事情,以防你不想自己写。

Java 8中的三种可能性:

 List<String> list = Arrays.asList("Alice", "Bob", "Charlie") String result = String.join(" and ", list); result = list.stream().collect(Collectors.joining(" and ")); result = list.stream().reduce((t, u) -> t + " and " + u).orElse(""); 

用java 8收集器,可以用下面的代码完成:

 Arrays.asList("Bill", "Bob", "Steve").stream() .collect(Collectors.joining(" and ")); 

另外,java 8中最简单的解决scheme:

 String.join(" and ", "Bill", "Bob", "Steve"); 

要么

 String.join(" and ", Arrays.asList("Bill", "Bob", "Steve")); 

我写了这个(我使用它的豆和利用toString ,所以不要写Collection<String> ):

 public static String join(Collection<?> col, String delim) { StringBuilder sb = new StringBuilder(); Iterator<?> iter = col.iterator(); if (iter.hasNext()) sb.append(iter.next().toString()); while (iter.hasNext()) { sb.append(delim); sb.append(iter.next().toString()); } return sb.toString(); } 

但是Collection不支持JSP,所以对于TLD我写道:

 public static String join(List<?> list, String delim) { int len = list.size(); if (len == 0) return ""; StringBuilder sb = new StringBuilder(list.get(0).toString()); for (int i = 1; i < len; i++) { sb.append(delim); sb.append(list.get(i).toString()); } return sb.toString(); } 

并放到.tld文件中:

 <?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" <function> <name>join</name> <function-class>com.core.util.ReportUtil</function-class> <function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature> </function> </taglib> 

并在JSP文件中使用它:

 <%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%> ${funnyFmt:join(books, ", ")} 

如果您想在不使用任何外部库的情况下使用JDK,那么您拥有的代码就是正确的方法。 没有简单的“单行程”,您可以在JDK中使用。

如果您可以使用外部库,我build议您查看Apache Commons库中的org.apache.commons.lang.StringUtils类。

用法的一个例子:

 List<String> list = Arrays.asList("Bill", "Bob", "Steve"); String joinedResult = StringUtils.join(list, " and "); 

一个正统的方法来实现它,是通过定义一个新的function:

 public static String join(String join, String... strings) { if (strings == null || strings.length == 0) { return ""; } else if (strings.length == 1) { return strings[0]; } else { StringBuilder sb = new StringBuilder(); sb.append(strings[0]); for (int i = 1; i < strings.length; i++) { sb.append(join).append(strings[i]); } return sb.toString(); } } 

样品:

 String[] array = new String[] { "7, 7, 7", "Bill", "Bob", "Steve", "[Bill]", "1,2,3", "Apple ][","~,~" }; String joined; joined = join(" and ","7, 7, 7", "Bill", "Bob", "Steve", "[Bill]", "1,2,3", "Apple ][","~,~"); joined = join(" and ", array); // same result System.out.println(joined); 

输出:

7,7,7和比尔和鲍勃和史蒂夫和[比尔]和1,2,3和苹果] [和〜,〜

你可以使用具有StringUtils类和联接方法的apache commons库。

检查这个链接: https : //commons.apache.org/proper/commons-lang/javadocs/api.2.0/org/apache/commons/lang/StringUtils.html

请注意,上面的链接可能会随着时间的推移而变得过时,在这种情况下,您可以在网上search“apache commons StringUtils”,这应该可以让您find最新的参考。

(从这个线程引用) C#String.Format()和String.Join()的Java等价物

使用java.util.StringJoiner Java 8解决scheme

Java 8有一个StringJoiner类。 但是你仍然需要写一些样板,因为它是Java。

 StringJoiner sj = new StringJoiner(" and ", "" , ""); String[] names = {"Bill", "Bob", "Steve"}; for (String name : names) { sj.add(name); } System.out.println(sj); 

你可以这样做:

 String aToString = java.util.Arrays.toString(anArray); // Do not need to do this if you are OK with '[' and ']' aToString = aToString.substring(1, aToString.length() - 1); 

或者一行(只有当你不需要'['和']')

 String aToString = java.util.Arrays.toString(anArray).substring(1).replaceAll("\\]$", ""); 

希望这可以帮助。

您可能想尝试Apache Commons的StringUtils连接方法:

http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html#join(java.util.Iterator,java.lang.String

我发现Apache的StringUtils捡起jdk的松弛;-)

如果您正在使用Eclipse集合 (以前称为GS集合 ),则可以使用makeString()方法。

 List<String> list = Arrays.asList("Bill", "Bob", "Steve"); String string = ListAdapter.adapt(list).makeString(" and "); Assert.assertEquals("Bill and Bob and Steve", string); 

如果您可以将List转换为Eclipse Collectionstypes,那么您可以摆脱适配器。

 MutableList<String> list = Lists.mutable.with("Bill", "Bob", "Steve"); String string = list.makeString(" and "); 

如果您只想使用逗号分隔的string,则可以使用不带参数的makeString()版本。

 Assert.assertEquals( "Bill, Bob, Steve", Lists.mutable.with("Bill", "Bob", "Steve").makeString()); 

注意:我是Eclipse集合的提交者。

谷歌的Guava API也有.join(),尽pipe(对于其他回复应该很明显),Apache Commons在这里是非常标准的。

编辑

我也注意到toString()底层的实现问题,关于包含分隔符的元素,但我认为我是偏执狂。

既然我在这方面有两点意见,我正在改变我的答案:

  static String join( List<String> list , String replacement ) { StringBuilder b = new StringBuilder(); for( String item: list ) { b.append( replacement ).append( item ); } return b.toString().substring( replacement.length() ); } 

这看起来和原来的问题很相似。

所以,如果你不想把整个jar子添加到你的项目中,你可以使用它。

我认为你的原始代码没有问题。 其实,所有人都build议的select看起来几乎是一样的(虽然它做了一些额外的validation)

这里是Apache 2.0许可证。

 public static String join(Iterator iterator, String separator) { // handle null, zero and one elements before building a buffer if (iterator == null) { return null; } if (!iterator.hasNext()) { return EMPTY; } Object first = iterator.next(); if (!iterator.hasNext()) { return ObjectUtils.toString(first); } // two or more elements StringBuffer buf = new StringBuffer(256); // Java default is 16, probably too small if (first != null) { buf.append(first); } while (iterator.hasNext()) { if (separator != null) { buf.append(separator); } Object obj = iterator.next(); if (obj != null) { buf.append(obj); } } return buf.toString(); } 

现在我们知道,谢谢你的开源

一个有趣的方式来使用纯JDK,在一个任务中执行:

 String[] array = new String[] { "Bill", "Bob", "Steve","[Bill]","1,2,3","Apple ][" }; String join = " and "; String joined = Arrays.toString(array).replaceAll(", ", join) .replaceAll("(^\\[)|(\\]$)", ""); System.out.println(joined); 

输出:

比尔和鲍勃和史蒂夫和[比尔]和1,2,3和苹果] [


一个不太完美也不太有趣的方式!

 String[] array = new String[] { "7, 7, 7","Bill", "Bob", "Steve", "[Bill]", "1,2,3", "Apple ][" }; String join = " and "; for (int i = 0; i < array.length; i++) array[i] = array[i].replaceAll(", ", "~,~"); String joined = Arrays.toString(array).replaceAll(", ", join) .replaceAll("(^\\[)|(\\]$)", "").replaceAll("~,~", ", "); System.out.println(joined); 

输出:

7,7,7和比尔和鲍勃和史蒂夫和[比尔]和1,2,3和苹果] [

你可以在Spring框架的StringUtils中使用它。 我知道它已经被提及,但是实际上你可以直接使用这个代码,并且它可以立即运行,而不需要Spring。

 // from https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/util/StringUtils.java /* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class StringUtils { public static String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix) { if(coll == null || coll.isEmpty()) { return ""; } StringBuilder sb = new StringBuilder(); Iterator<?> it = coll.iterator(); while (it.hasNext()) { sb.append(prefix).append(it.next()).append(suffix); if (it.hasNext()) { sb.append(delim); } } return sb.toString(); } } 

尝试这个:

 java.util.Arrays.toString(anArray).replaceAll(", ", ",") .replaceFirst("^\\[","").replaceFirst("\\]$","");