有没有一种方法可以用Java8格式编写下面的代码?

ijnw1ujt  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(367)

我正在编写一段代码,用于为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中以函数的方式包含这一点。希望这能使我的问题更清楚。

z9ju0rcb

z9ju0rcb1#

类似“Java8”的解决方案可以使用 Stream.limit 只取2个子名字 Collectors.joining("") .
支票 name.contains(".") 可以删除,可以在拆分输入字符串后定义。

String getFirstTwoSubNames(final String name) {
    if (name == null) {
        throw new IllegalArgumentException("can't be null");
    }
    String[] subNames = name.split("\\.");
    if (subNames.length < 2) {
        throw new IllegalArgumentException("Invalid format");
    }
    return "SUBNAME_" + Arrays.stream(subNames).limit(2).collect(Collectors.joining(""));
}

更新
更新后的代码片段#2可能会被重构,将验证代码分离到单独的方法中,以便 getFirstTwoSubnames 仅使用有效名称:

static String validName(String name) {
    return Stream.of(Optional.ofNullable(name).orElseThrow(NullNameException::new))
                 .filter(name -> name.contains("."))
                 .findFirst()
                 .orElseThrow(MinSubnamesException::new);
}

static String getFirstTwoSubNames(final String name) {
    return "SUBNAME_" + Arrays.stream(validName(name).split("\\."))
                              .limit(2)
                              .collect(Collectors.joining());
}

//--------
// customized exceptions
class NullNameException extends NullPointerException {
    public NullNameException() {
        super("Name cannot be null");
    }
}

class MinSubnamesException extends IllegalArgumentException {
    public MinSubnamesException() {
        super("A name must contain at least two sub-names separated with dot `.`");
    }
}

相关问题