Java中连接两个字符串的方法

12

我有一个在Java中连接两个字符串的方法。目前它可以正常工作,但我认为它可以写得更好。

public static String concat(String str1, String str2) {
  String rVal = null;
  if (str1 != null || str2 != null) {
    rVal = "";
    if (str1 != null) {
      rVal += str1;
    }
    if (str2 != null) {
      rVal += str2;
    }      
  }    
  return rVal;
}

以下是一些要求:

  1. 如果str1和str2都为null,则该方法返回null
  2. 如果str1或str2中有一个为null,则它将仅返回非null的字符串
  3. 如果str1和str2都不为null,则它将连接它们
  4. 它从不向结果中添加"null"

有人能用更少的代码实现吗?


如果我调用str1.concat(str2),当str1为null时,它会抛出NullPointerException。 - Ryan
你不能只使用 StringBuilder 吗? - Ant
@Ant 我不确定它是否很好地处理了空值情况。 - Ryan
这个问题真的有7票吗?真的吗?只是为了能够用三元运算符重写相同的东西吗? - GreenieMeanie
5个回答

15

仅使用简单的if语句:

public static String concat(String str1, String str2) {
    if(str1==null) return str2;
    if(str2==null) return str1;
    return str1 + str2;
}

或者,如果你对括号有着深厚的热爱:

public static String concat(String str1, String str2) {
    if(str1==null)
    { 
        return str2;
    }
    if(str2==null) 
    {
        return str1;
    }
    return str1 + str2;
}

你不喜欢嵌套条件语句 - 我不喜欢没有大括号的 if 语句 :) - Jon Skeet
@Jon一开始也有这些,但在我看来,在这种简单的情况下更好的是紧凑性。 - Michael Borgwardt

14
当然:
public static String concat(String str1, String str2) {
  return str1 == null ? str2
      : str2 == null ? str1
      : str1 + str2;
}
请注意,这个语句已经处理了第一个条件中"两者都为空"的情况:如果str1为空,则你要么返回null(如果str2也为空),要么返回str2(如果str2不为空),这两种情况都是通过返回str2来处理的。

3
嵌套条件运算符?说真的? - Michael Borgwardt
2
有些人可以读懂它,有些人则不能。对于初学者来说,这确实更加令人困惑。我宁愿将它们放在一个单行中,并用括号括起来。就像这样:return (str1 == null) ? str2 : ((str2 == null) ? str1 : (str1 + str2)); - BalusC
1
@Michael:绝对没错 - 当你想要测试多个条件并且有偏好时,我发现这是一种非常有用的模式。 - Jon Skeet
2
@BalusC:我认为括号会增加混淆,而换行则更清晰地展示了逻辑结构。不过这只是个人喜好的问题。 - Jon Skeet
1
请添加没有条件运算符的版本,以便完整和美观。有时候更多的代码会减少混乱! - Hardcoded
显示剩余3条评论

4
import org.apache.commons.lang.StringUtils;

StringUtils.join([str1, str2]);

将提供的数组元素连接成一个字符串,包含提供的元素列表。

连接后的字符串中不添加分隔符。数组中的空对象或空字符串用空字符串表示。

 StringUtils.join(null)            = null
 StringUtils.join([])              = ""
 StringUtils.join([null])          = ""
 StringUtils.join(["a", "b", "c"]) = "abc"
 StringUtils.join([null, "", "a"]) = "a"

@Nishu 这很接近了,但是需要一个简单的空值检查,以防 str1 和 str2 都为空。 - Ryan

0

似乎大家都忽略了条件1,即如果两个字符串都为空,则返回null。最简单易读的版本(在我看来)如下:

public static String concat(String str1, String str2) {  
    if(str1==null && str2==null) return null;  
    if(str1==null) return str2;  
    if(str2==null) return str1;  
    return str1 + str2;  
}

1
Jon和Michael的解决方案在第一个条件上都会返回null(返回另一个为null的字符串),如果两个字符串都为null。你的解决方案只是增加了一个不必要的额外测试条件。 - defectivehalt

0
public class ConcatTest extends TestCase {

    // 1. If both str1 and str2 are null, the method returns null
    public void testBothNull() throws Exception {
        assertNull(concat(null, null));
    }

    // 2. If either str1 or str2 is null, it will just return the not null
    // String
    public void testOneNull() throws Exception {
        assertEquals("a", concat(null, "a"));
        assertEquals("b", concat("b", null));
    }

    // 3. If str1 and str2 are not null, it will concatenate them
    public void testNonNull() throws Exception {
        assertEquals("ab", concat("a", "b"));
    }

    // 4. It never adds "null" to the result (not really testable)

    public static String concat(String a, String b) {
        if (a == null && b == null)
            return null;
        return denulled(a) + denulled(b);
    }

    private static String denulled(String s) {
        return s == null ? "" : s;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接