我必须使用一种方法来调用连接器,并以“”作为连接字符串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(" "));
}
答案 0 :(得分:4)
他要简单得多;在一行中,它基本上说:
取字符串a和b,除去空的字符串,然后将其余的字符串与空格连接起来,返回结果。
这样可以很清楚地看到代码的意图。它还可以防止错误,因为在扩展代码中出现输入错误或逻辑错误会更容易,从而将实现分解为多种情况。
诚然,这可能比开始的代码更难理解,因为初学者可能不理解流。但是一旦您理解了它们,它肯定会更容易阅读(至少在这种情况下,但并非总是如此),并且使编写此类方法变得更加容易。因此,最好是现在就学习这种Java构造并使用它们,而不是以后使用。
他的代码也更加灵活。如果必须使该方法连接三个字符串,则对其方法的唯一修改就是将Stream.of(a, b)
更改为Stream.of(a, b, c)
。您的方法将需要进行更多更改。
此外,使用isEmpty()
比.equals("")
更为清晰,因为它以更自然的英语术语表明了您正在做的事情。这又可以防止错别字,因为您可能会意外地.equals(" ")
(带空格)或其他操作。
此外,为什么还要使用两种不同的方法(equals
和contentEquals
)来做同一件事?令人困惑。他的方法不能做到这一点。
答案 1 :(得分:2)
首先,在这种事情中总有一种见解。可能还有沟通和个性。争论真的值得您付出努力吗?如果您的审稿人希望在评论中重写您的代码, 1 有什么害处?
现在是实质内容。
从表面上看,一旦您熟悉Java 8流,您的审阅者的代码显然更加简洁和易于理解。而且我认为这样的假设是,即使不精通Streams 2 ,每个从事此项目的人都应该熟悉。显然,它可以更巧妙地处理边缘情况。
我还要指出,您使用StringJoiner
来连接2个字符串,并且两个字符串之间有一个空格是过大的。一个简单的连接表达式比您正在执行的操作更加有效和易于理解。
return a + " " + b;
唯一的区别是性能:
(但是请注意,只有在有具体证据表明该方法的性能对整个应用程序至关重要时,才应该对性能进行优化。如果不是,那么优化很可能是浪费的时间,而几分钟/几小时的时间可能要花费更多,因为浪费了数百万个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流,请尽快学习它们!