我正在编写一段代码,用于为ddb表创建分区键。我有点格式的长名字,可以有尽可能多的名字以“.”分隔
e、 g.qw.er.ty.ui公司
我希望下面的方法将上面名称的子名称返回为“subname\u qwer”。i、 e“子名\”+名字+第二名。其中first name是长名称中第一个点之前的字符串。第二个名称是第一个点之后第二个点之前的字符串。
我不想对代码的行为做任何更改,但我想用Java8的方式编写它。有可能吗?
代码段1:
//name is a dotted format hierarchical name. e.g. n.x.y.c
String getFirstTwoSubNames(final String name) {
if (name == null) {
throw new IllegalArgumentException("can't be null");
}
if (name.contains(".")) {
String[] subNames = name.split("\\.");
String firstTwoSubNames = subNames[0] + subNames[1];
return String.join("_", "SUBNAME", firstTwoSubNames);
} else {
throw new IllegalArgumentException("Invalid format");
}
}
更新1:很抱歉我的问题写得这么差。我对Java8和堆栈溢出还不熟悉。这里的任务是去掉命令式编码,采用Java8的函数式编码风格。到目前为止,在@alex rudenko的回答的帮助下,我能够将上述代码转换为功能性java 8-y代码,如下所示:
代码段2:
String getFirstTwoSubNames(final String name) {
return "SUBNAME_" + Arrays.stream(Optional.ofNullable(name)
.orElseThrow(IllegalArgumentException::new)
.split("\\."))
.limit(2)
.collect(Collectors.joining(""));
}
如您所见,我缺少从代码片段1引发无效异常的逻辑。我希望在代码片段2中以函数的方式包含这一点。希望这能使我的问题更清楚。
1条答案
按热度按时间z9ju0rcb1#
类似“Java8”的解决方案可以使用
Stream.limit
只取2个子名字Collectors.joining("")
.支票
name.contains(".")
可以删除,可以在拆分输入字符串后定义。更新
更新后的代码片段#2可能会被重构,将验证代码分离到单独的方法中,以便
getFirstTwoSubnames
仅使用有效名称: