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

标签 java java-stream

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

相关文章:

java - RMI 连接何时创建?

java - 为什么慢任务会阻塞该使用并行流的程序中的其他较小任务?

Java 8 Stream非静态方法流不能被引用

java - Stream API 使用的方便复杂性?

java - Java 8 并行流中的自定义线程池

java - java.util.Base64.getMimeDecoder() 接受长度超过 76 个字符的 String 是否正常?

java - QuickBooks 在线编程访问

Java - java.lang.IllegalStateException : source already consumed or closed

java - 将 double[] 数组添加到 weka 实例

java - 如何避免流中出现空值