java - 传递将参数传递给方法的 Lambda

标签 java methods lambda

我正在寻找一种将代码块传递给方法的方法,然后该方法将对传递给方法的其他参数执行操作,获取这些操作的结果,并将这些结果传递给传递给该方法的代码块。为了清楚起见:

private static void method1(String filename, int sheetNum) {
    runOnSheet(filename, () -> {
        doStuffWithStream(FileInputStream fileStream);         // Does something with a file stream
        doOtherStuffWithStream(FileInputStream fileStream);    // Does something else with a file stream
    });
}

// Elsewhere
private static void runOnFile(String fileName, Runnable block1) {
    try {
        fileStream = new FileInputStream(fileName);
    } catch (IOException e) {
        e.printStackTrace();
    }

    block1.run();    // I'd like to pass fileStream to this code block. Ideally i could do block1.run(fileStream );

    fileStream.close();
}

我希望能够在需要打开文件、在流上运行一些代码以及关闭流的任何地方重用 runOnFile。
我实际上想做的更复杂,除了 FileInputStream 之外还使用其他库,但我希望完成的结构是相同的。

感谢您的帮助!

最佳答案

Java 8+ 有一个名为 Consumer 的类,可用于您的用例: https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html

private static void method1(String filename, int sheetNum) {
    runOnFile(filename, (fileStream) -> {
        doStuffWithStream(fileStream);
        doOtherStuffWithStream(fileStream);
    });
}

// Elsewhere
private static void runOnFile(String fileName, Consumer<FileInputStream> block1) {
    try {
        fileStream = new FileInputStream(fileName);
    } catch (IOException e) {
        e.printStackTrace();
    }

    block1.accept(fileStrean);

    fileStream.close();
}

编辑:按照 Dimitri 使用 try-with-resource 语法的建议:

// Elsewhere
private static void runOnFile(String fileName, Consumer<FileInputStream> block1) {
    try (FileInputStream fis = new FileInputStream(fileName)) {
        block1.accept(fis);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关于java - 传递将参数传递给方法的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44828695/

相关文章:

java - 用Java编写访问数据库?

java - 调用方法时出现问题(扫雷)

java - 计算在 Java 中调用静态方法的频率

java - 大型训练数据集上的 WEKA(java 代码)

java - 在 swings 中设置 jspinner 的时间格式

java - 检索当前 Windows 用户的名字和姓氏?

java - 重写和重载之间的区别?

java - 如果不为空 - java 8 风格

Ruby 函数与方法

c# - 为什么反射会为 lambda 返回如此奇怪的名称?