gpt4 book ai didi

java - 替代新方法以避免重复代码

转载 作者:行者123 更新时间:2023-12-03 15:14:45 25 4
gpt4 key购买 nike

我想将相同的操作应用于不同的流(目前使用 Java 8)

背景:我正在尝试从 Tika Metadata 对象中获取维度数据

以下工作但重复代码(metadata 是 Tika Metadata 对象):

    private static void processDimensions(final Metadata metadata) {
Optional<Integer> optWidth = Arrays.stream(new String[] {"tiff:ImageWidth", "Image Width"})
.map(metadata::get)
.filter(Objects::nonNull)
.map(v -> v.replace("pixels", ""))
.map(Integer::parseInt).findFirst();
// do something with optWidth

Optional<Integer> optHeight = Arrays.stream(new String[] {"tiff:ImageLength", "Image Height"})
.map(metadata::get)
.filter(Objects::nonNull)
.map(v -> v.replace("pixels", ""))
.map(Integer::parseInt).findFirst();
// do something with optHeight
}

我已经到了不重复代码的地步:

    private static void processDimensions(final Metadata metadata) {
Optional<Integer> optWidth = processDimension(metadata, "tiff:ImageWidth", "Image Width");
// do something with optWidth

Optional<Integer> optHeight = processDimension(metadata, "tiff:ImageLength", "Image Height");
// do something with optHeight
}

private static Optional<Integer> processDimension(final Metadata metadata, @NonNull final String... keys) {
return Arrays.stream(keys).map(metadata::get).filter(Objects::nonNull).map(v -> v.replace("pixels", ""))
.map(Integer::parseInt).findFirst();
}

是否可以在没有单独的方法(例如 processDimensions() 中的函数)的情况下做同样的事情?那看起来怎么样?

最佳答案

是的,将其声明为 java.util.Function 并重用它。

Function<String[], OptionalInt> funct = keys -> Arrays.stream(keys)
.map(metadata::get)
.filter(Objects::nonNull)
.map(v -> v.replace("pixels", ""))
.mapToInt(Integer::parseInt)
.findFirst();

这是你如何调用它。

funct.apply(strArr);

事实上,声明一个方法会给出一个更具可读性的名称,例如 processDimensions,并且您可以使用比 lambda 更具描述性的名称声明参数类型,因此它对我来说更具可读性。除非您精通流,否则您可能很难阅读此管道。此外,方法定义了事实上的 API,但流管道通常没有。

关于java - 替代新方法以避免重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60340590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com