这与方法之间的区别

时间:2019-05-25 00:20:07

标签: java

我必须使用一种方法来调用连接器,并以“”作为连接字符串a和b的参数,我必须检查双方是否为empy(“”)。 两种代码都有效,但是我不明白为什么我的审稿人希望我以他的方式这样做。如果有人可以向我解释它的好处,那就太好了。

我的方法。

public static String join(String a, String b) {
    StringJoiner sj = new StringJoiner(" ");
    if (a.endsWith("dieci") || a.endsWith("veinti")) {
        return a + b;
    }       
    if (a.equals("")) {
        return b;
    }
    if (b.contentEquals("")) {
        return a;
    }
    sj.add(a);
    sj.add(b);
    return sj.toString();
}

他的方法。

public static String join(String a, String b) {
    if (a.endsWith("dieci") || a.endsWith("veinti")) {
        return a + b;
    }
    return Stream.of(a, b).filter(s ->!s.isEmpty()).collect(Collectors.joining(" "));       
}

2 个答案:

答案 0 :(得分:4)

他要简单得多;在一行中,它基本上说:

  

取字符串a和b,除去空的字符串,然后将其余的字符串与空格连接起来,返回结果。

这样可以很清楚地看到代码的意图。它还可以防止错误,因为在扩展代码中出现输入错误或逻辑错误会更容易,从而将实现分解为多种情况。

诚然,这可能比开始的代码更难理解,因为初学者可能不理解流。但是一旦您理解了它们,它肯定会更容易阅读(至少在这种情况下,但并非总是如此),并且使编写此类方法变得更加容易。因此,最好是现在就学习这种Java构造并使用它们,而不是以后使用。

他的代码也更加灵活。如果必须使该方法连接三个字符串,则对其方法的唯一修改就是将Stream.of(a, b)更改为Stream.of(a, b, c)。您的方法将需要进行更多更改。

此外,使用isEmpty().equals("")更为清晰,因为它以更自然的英语术语表明了您正在做的事情。这又可以防止错别字,因为您可能会意外地.equals(" ")(带空格)或其他操作。

此外,为什么还要使用两种不同的方法(equalscontentEquals)来做同一件事?令人困惑。他的方法不能做到这一点。

答案 1 :(得分:2)

首先,在这种事情中总有一种见解。可能还有沟通和个性。争论真的值得您付出努力吗?如果您的审稿人希望在评论中重写您的代码, 1 有什么害处?

现在是实质内容。

从表面上看,一旦您熟悉Java 8流,您的审阅者的代码显然更加简洁和易于理解。而且我认为这样的假设是,即使不精通Streams 2 ,每个从事此项目的人都应该熟悉。显然,它可以更巧妙地处理边缘情况。

我还要指出,您使用StringJoiner来连接2个字符串,并且两个字符串之间有一个空格是过大的。一个简单的连接表达式比您正在执行的操作更加有效和易于理解。

   return a + " " + b;

唯一的区别是性能:

  • 我不清楚哪个会更好。您需要确定两个版本的基准。
  • 如果您正在针对使用的CPU周期或垃圾产生进行优化,那么这两个版本都不是最佳选择。

(但是请注意,只有在有具体证据表明该方法的性能对整个应用程序至关重要时,才应该对性能进行优化。如果不是,那么优化很可能是浪费的时间,而几分钟/几小时的时间可能要花费更多,因为浪费了数百万个CPU周期。)


仅出于信息目的,如果我需要优化性能,我会编写如下方法:

public static String join(String a, String b) {
    if (a.isEmpty()) {
        return b;
    } else if (b.isEmpty()) {
        return a;
    } else if (a.endsWith("dieci") || a.endsWith("veinti")) {
        return a + b;
    } else {
        return a + " " + b;
    }
}

我将让读者弄清楚我的所作所为以及原因。以及我所做的(可能是毫无根据的)假设。


1-如果 他正在破坏您或他的生产力,那就是伤害...

2-Java 8已有4年以上的历史了。专业人士需要大量时间来学习使用其新功能。而且,如果您刚从Uni中学起并且没有教您Java 8流,请尽快学习它们!