我想将相同的操作应用于不同的流(目前使用 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/