首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP的内爆的Java等价物(‘,’,array_filter( array_filter ()

PHP的内爆的Java等价物(‘,’,array_filter( array_filter ()
EN

Stack Overflow用户
提问于 2012-06-28 23:38:57
回答 9查看 83.5K关注 0票数 80

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

代码语言:javascript
复制
$ordine['address'] = implode(', ', array_filter(array($cliente['cap'], $cliente['citta'], $cliente['provincia'])));

它会清除空字符串,并用",“将它们连接起来。如果只剩下一个,它不会添加额外的不需要的逗号。它不会在末尾添加逗号。如果没有,则返回空字符串。

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

代码语言:javascript
复制
""
"Street abc 14"
"Street abc 14, 00168"
"Street abc 14, 00168, Rome"

在不添加外部库(为设计)的情况下,在Java中最好的Java实现(更少的代码)是什么?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-06-29 00:11:24

使用Java 8的更新版本(post结束时的原始版本)

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

代码语言:javascript
复制
- `String.join(" > ", new String[]{"foo", "bar"});`
- `String.join(" > ", "foo", "bar");`

代码语言:javascript
复制
- `String.join(" > ", Arrays.asList("foo", "bar"));`

从Java8开始,我们可以使用StringJoiner (而不是最初使用的StringBulder)并简化我们的代码。

此外,为了避免在每次调用matches(" *")时重新编译" *"正则表达式,我们可以创建单独的模式,将其编译后的版本保存在某个字段中,并在需要时使用它。

代码语言:javascript
复制
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();
}   

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

代码语言:javascript
复制
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));
}

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

我们可以从模式中创建这样的谓词。以这种方式创建的谓词将接受包含可由正则表达式匹配的子字符串的任何字符串(因此,如果正则表达式将查找"\\S",则谓词将接受"foo "" foo bar ""whatever"等字符串,但不接受" "" ")。

所以我们可以使用

代码语言:javascript
复制
Pattern.compile("\\S").asPredicate();

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

代码语言:javascript
复制
Pattern.compile("^\\s*$").asPredicate().negate();

下一步,当filter将删除所有空的,或者只包含空格的字符串时,我们可以collect其余的元素。多亏了Collectors.joining,我们可以决定使用哪个分隔符。

原始答案( Java 8之前的版本)

代码语言:javascript
复制
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();
}

你可以像这样使用它

代码语言:javascript
复制
System.out.println(implode(", ", "ab", " ", "abs"));

代码语言:javascript
复制
System.out.println(implode(", ", new String[] { "ab", " ", "abs" }));

输出ab, abs

票数 95
EN

Stack Overflow用户

发布于 2013-01-29 22:10:56

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

票数 79
EN

Stack Overflow用户

发布于 2016-01-13 08:59:36

以下是Android特有的答案,可能会对一些人有所帮助:

代码语言:javascript
复制
String combined = TextUtils.join(",", new String[]{"Red", "Green", "Blue"});

// Result => Red,Green,Blue

确保导入TextUtils类:

代码语言:javascript
复制
import android.text.TextUtils;
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11248119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档