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

max*_*ver 69 php java

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

$ordine['address'] = implode(', ', array_filter(array($cliente['cap'], $cliente['citta'] ,$cliente['provincia'])));
Run Code Online (Sandbox Code Playgroud)

它清除空字符串并用","连接它们.如果只剩下一个,则不会添加额外不需要的逗号.它最后没有添加逗号.如果没有,则返回空字符串.

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

""
"Street abc 14"
"Street abc 14, 00168"
"Street abc 14, 00168, Rome"
Run Code Online (Sandbox Code Playgroud)

Java中最好的Java实现(更少的代码)是什么,而不必添加外部库(为Android设计)?

Psh*_*emo 83

使用Java 8更新的版本(原帖在帖子末尾)

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


从Java 8开始,我们可以使用StringJoiner(而不是最初使用StringBulder)并简化我们的代码.
另外为了避免" *"在每次调用中重新编译正则表达式,matches(" *")我们可以创建单独的Pattern,它将在某些字段中保存其编译版本并在需要时使用它.

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();
}   
Run Code Online (Sandbox Code Playgroud)

使用流我们的代码可以看起来像.

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));
}
Run Code Online (Sandbox Code Playgroud)

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

我们可以从Pattern创建这样的谓词.谓词创建这样将接受其中将包含子这可以通过正则表达式匹配任何字符串(所以,如果正则表达式将寻找"\\S"谓词会接受像琴弦"foo "," foo bar ","whatever",但不会接受" "也不是" ").

所以我们可以使用

Pattern.compile("\\S").asPredicate();
Run Code Online (Sandbox Code Playgroud)

或者可能只是更具描述性,否定只是空格或空的字符串

Pattern.compile("^\\s*$").asPredicate().negate();
Run Code Online (Sandbox Code Playgroud)

接下来,当filter将删除所有空,或仅包含空格时,我们可以使用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();
}
Run Code Online (Sandbox Code Playgroud)

你可以像使用它一样

System.out.println(implode(", ", "ab", " ", "abs"));
Run Code Online (Sandbox Code Playgroud)

要么

System.out.println(implode(", ", new String[] { "ab", " ", "abs" }));
Run Code Online (Sandbox Code Playgroud)

产量 ab, abs


Bog*_*rym 78

为什么如此严肃?试试StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")吧!

  • StringUtils是一个外部库 (29认同)
  • 它是由Apache制作的,每个人都使用它...我正在做Bogdan的方式,你们做你想做的 (28认同)
  • 如果图书馆已经可用,你可以"按照自己的方式行事".如果不是,a)你需要知道它是一个外部的b)你在哪里/如何得到它和c)你是否被允许这样做.扮演非公司牛仔只能让你从c)中解脱出来 (9认同)
  • 外部库可以在这里找到:http://commons.apache.org/proper/commons-lang/ (3认同)

nic*_*ckb 17

您必须将您的字符串添加到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();
}
Run Code Online (Sandbox Code Playgroud)

另外,如果你有String[]一个字符串数组,你可以轻松地将它们添加到ArrayList:

String[] s;
List<String> list = new ArrayList<String>( Arrays.asList( s));
Run Code Online (Sandbox Code Playgroud)


dlo*_*omb 16

以下是Android特定的答案,可能对某些人有所帮助

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

//Result => Red,Green,Blue
Run Code Online (Sandbox Code Playgroud)

请务必导入TextUtils类

import android.text.TextUtils;
Run Code Online (Sandbox Code Playgroud)