PHP的implode相当于Java(',',array_filter(array()))

我经常在PHP中使用这段代码

$ordine['address'] = implode(', ', array_filter(array($cliente['cap'], $cliente['citta'] ,$cliente['provincia']))); 

清空空string并用“,”join。 如果只剩下一个,它不会添加额外的不必要的逗号。 最后不会添加逗号。 如果不存在,则返回空string。

因此,我可以得到以下结果之一

 "" "Street abc 14" "Street abc 14, 00168" "Street abc 14, 00168, Rome" 

Java中最好的Java实现(less代码), 而不必添加外部库 (为Androiddevise)?

使用Java 8更新的版本(原文在文章结尾处)

如果你不需要过滤任何你可以使用的元素

  • String.join(CharSequence分隔符, CharSequence...元素)

    • String.join(" > ", new String[]{"foo", "bar"});
    • String.join(" > ", "foo", "bar");
  • 或者String.join(CharSequence分隔符, Iterable<? extends CharSequence>元素)

    • String.join(" > ", Arrays.asList("foo", "bar"));

从Java 8开始,我们可以使用StringJoiner (而不是原来使用的StringBulder )来简化我们的代码。
同样为了避免在每个matches(" *")调用matches(" *")重新编译" *"正则expression式,我们可以创build单独的模式,它将在某个字段中保存其编译版本,并在需要时使用它。

 private static final Pattern SPACES_OR_EMPTY = Pattern.compile(" *"); public static String implode(String separator, String... data) { StringJoiner sb = new StringJoiner(separator); for (String token : data) { if (!SPACES_OR_EMPTY.matcher(token).matches()) { sb.add(token); } } return sb.toString(); } 

用stream我们的代码可以看起来像。

 private static final Predicate<String> IS_NOT_SPACES_ONLY = Pattern.compile("^\\s*$").asPredicate().negate(); public static String implode(String delimiter, String... data) { return Arrays.stream(data) .filter(IS_NOT_SPACES_ONLY) .collect(Collectors.joining(delimiter)); } 

如果我们使用stream,我们可以filter Predicate元素。 在这种情况下,我们希望谓词接受不仅是空格的string – 换句话说,string必须包含非空白字符。

我们可以从Pattern中创build这样的Predicate。 以这种方式创build的谓词将接受任何string将包含可以通过正则expression式匹配的子string(所以如果正则expression式会查找"\\S"谓词将接受像"foo "" foo bar ""whatever" ,但将不接受" "" " )。

所以我们可以使用

 Pattern.compile("\\S").asPredicate(); 

或者可能只是更多描述性的否定只有空格或空的string

 Pattern.compile("^\\s*$").asPredicate().negate(); 

接下来当filter将删除所有空的或只包含空格的string时,我们可以collect其余的元素。 感谢Collectors.joining我们可以决定使用哪个分隔符。


原始答案(在Java 8之前)

 public static String implode(String separator, String... data) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.length - 1; i++) { //data.length - 1 => to not add separator at the end if (!data[i].matches(" *")) {//empty string are ""; " "; " "; and so on sb.append(data[i]); sb.append(separator); } } sb.append(data[data.length - 1].trim()); return sb.toString(); } 

你可以使用它

 System.out.println(implode(", ", "ab", " ", "abs")); 

要么

 System.out.println(implode(", ", new String[] { "ab", " ", "abs" })); 

输出ab, abs

为什么那么认真? 试试StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

你必须添加你的string到一个ArrayList,删除空的,并相应的格式化:

 public static String createAddressString( String street, String zip_code, String country) { List<String> list = new ArrayList<String>(); list.add( street); list.add( zip_code); list.add( country); // Remove all empty values list.removeAll(Arrays.asList("", null)); // If this list is empty, it only contained blank values if( list.isEmpty()) { return ""; } // Format the ArrayList as a string, similar to implode StringBuilder builder = new StringBuilder(); builder.append( list.remove(0)); for( String s : list) { builder.append( ", "); builder.append( s); } return builder.toString(); } 

另外,如果你有String[]这个string数组,你可以很容易地将它们添加到ArrayList中:

 String[] s; List<String> list = new ArrayList<String>( Arrays.asList( s)); 

这是一个Android的具体答案,可能有助于一些

 String combined = TextUtils.join(",", new String[]{"Red", "Green", "Blue"}); //Result => Red,Green,Blue 

一定要导入TextUtils类

 import android.text.TextUtils; 

一个简单的Implode

 public static String implode(String glue, String[] strArray) { String ret = ""; for(int i=0;i<strArray.length;i++) { ret += (i == strArray.length - 1) ? strArray[i] : strArray[i] + glue; } return ret; } 

你可以为它创build重载

以上它相当于php implode。
这是你想要的:

 import java.lang.* public static String customImplode(String glue, String[] strArray) { String ret = ""; for(int i=0;i<strArray.length;i++) { if (strArray[i].trim() != "") ret += (i == strArray.length - 1) ? strArray[i] : strArray[i] + glue; } return ret; } 

使用stream(对于Java 8和更高版本)将是替代可能的解决scheme。 您需要导入

 java.util.stream.Collectors; 

使用join过程

您可以使用:

 Arrays.asList("foo","bar").stream().collect(Collectors.joining(",")); 

达到预期的效果。

这是我的内部实现:

 /** * Implodes the specified items, gluing them using the specified glue replacing nulls with the specified * null placeholder. * @param glue The text to use between the specified items. * @param nullPlaceholder The placeholder to use for items that are <code>null</code> value. * @param items The items to implode. * @return A <code>String</code> containing the items in their order, separated by the specified glue. */ public static final String implode(String glue, String nullPlaceholder, String ... items) { StringBuilder sb = new StringBuilder(); for (String item : items) { if (item != null) { sb.append(item); } else { sb.append(nullPlaceholder); } sb.append(glue); } return sb.delete(sb.length() - glue.length(), sb.length()).toString(); } 
 public static String implode(List<String> items, String separator) { if (items == null || items.isEmpty()) { return null; } String delimiter = ""; StringBuilder builder = new StringBuilder(); for (String item : items) { builder.append(delimiter).append(item); delimiter = separator; } return builder.toString(); } 

使用这个简单的function:

 private String my_implode(String spacer,String[] in_array){ String res = ""; for(int i = 0 ; i < in_array.length ; i++){ if( !res.equals("") ){ res += spacer; } res += in_array[i]; } return res; } 

使用 :

 data_arr = {"d1","d2","d3"}; your_imploded_text = my_implode(",", data_arr); //output : your_imploded_text = "d1,d2,d3"