将文件加载到java.util.Properties中的一行

One-liner to load files into java.util.Properties

我有很多 java 包含凭据和其他配置的属性文件,我正在寻找最紧凑的代码来在 Nashorn 的 java 脚本和 Java 中加载这些文件.

到目前为止,我还剩下 2 行:

credentials = new java.util.Properties();
credentials.load(new java.io.FileInputStream("credentials.properties"));

我试过这个明显的合并,但它在 Nashorn 中不起作用:

credentials = (new java.util.Properties()).load(new java.io.FileInputStream("credentials.properties"));

这些可以合并为一行吗?可读性受到严重影响也没关系

我认为它应该有效,至少在 Java :

    (credentials = new java.util.Properties()).load(new java.io.FileInputStream("credentials.properties"));

最简单和最安全的解决方案是使用实用方法引入一个间接层:

public static Properties loadProperties(File file)
{
    Properties props = new Properties();
    try (FileInputStream fis = new FileInputStream(file))
    {
        props.load(fis);
    }
    catch (IOException ioex) { ioex.printStackTrace(); }
    return props;
}

Properties credentials = loadProperties(new File("credentials.properties"));

等效的 JS 是(没有 try/catch):

function loadProperties(file) {
    var props = new java.util.Properties();
    props.load(new java.io.FileInputStream(file));
    return props;
}

通过添加 try 语句,您还可以轻松捕获 I/O 个错误。

如果你想使用 Java-8 风格并非常规地使用 Optional 和 lambda,你可以试试这个

Properties credentials=Optional.of(new Properties()).map(p->{try{p.load(new FileInputStream("credentials.properties"));}catch(IOException e){}return p;}).get();

(更长,但带有换行符的可读性更高的版本)

Properties credentials = Optional.of(new Properties())
    .map(p -> {
             try
             {
                p.load(new FileInputStream("credentials.properties"));
             }
             catch (IOException ex) {}
             return p;
         })
    .get();

更新:

没有 try/catch 它变成了 java:

Properties credentials = Optional.of(new Properties()).map(p -> { p.load(new FileInputStream("credentials.properties")); return p; }).get();

对于 Nashorn js:

var credentials = java.util.Optional.of(new java.util.Properties()).map(function(p) { p.load(new java.io.FileInputStream("credentials.properties")); return p;}).get();