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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (80)

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

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

它清空空字符串并用“,”加入它们。如果只剩下一个,它不会添加额外的不需要的逗号。它最后不会添加逗号。如果不存在,则返回空字符串。

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

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

Java中最好的Java实现(少代码),而无需添加外部库(针对Android设计)?

提问于
用户回答回答于

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

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

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

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();
}   

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

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));
}

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

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

所以我们可以使用

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

或者可能只有更多描述性的否定只有空格或空的字符串

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

接下来,当过滤器将删除所有空或者只包含空格的字符串时,我们可以将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", "!"}, ", ")

扫码关注云+社区