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

将文件加载到java.util.Properties中的一行程序,java,nashorn,Java,Nashorn,我有许多包含凭证和其他配置的java属性文件,我正在寻找最紧凑的代码,以便在Nashorn的javascript和java中加载这些文件 到目前为止,我只剩下两行: credentials = new java.util.Properties(); credentials.load(new java.io.FileInputStream("credentials.properties")); 我尝试过这种明显的合并,但在纳肖恩不起作用: credentials = (new java.util

我有许多包含凭证和其他配置的java属性文件,我正在寻找最紧凑的代码,以便在Nashorn的javascript和java中加载这些文件

到目前为止,我只剩下两行:

credentials = new java.util.Properties();
credentials.load(new java.io.FileInputStream("credentials.properties"));
我尝试过这种明显的合并,但在纳肖恩不起作用:

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
):


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

如果您想以Java-8风格使用
Optional
和lambdas,您可以尝试以下方法

Properties credentials=Optional.of(new Properties()).map(p->{try{p.load(new FileInputStream("credentials.properties"));}catch(IOException e){}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();

这仍然是一个两行程序,因为您必须保留变量声明。是的,但是声明不在原始的两行程序中。我保持代码简单以避免混淆。在js中,最初的第一行是“var credentials=new java.util.Properties();”。我试过你的代码,但在js中,我无法让它与“(var credentials=…”一起工作。因此,在java中可能是1行,但在js中可能是2行。这是1.5行:-)可能有一些js技巧可以做到这一点(操纵原型?)但我对这方面不太了解javascript@bwt使用prototype会使js和java代码分歧过大。lambdas最合适。谢谢你的1.5班轮。我对它进行了升级,如果代码中预定义了变量,我将使用它。Nashorn javascript可以使用try/catch/finally。我真的在寻找一个对js和java都有效的单行程序。我没有选择函数/干法,否则我不会问这个问题。如果这个和@bwt的解决方案都不适合你,那么我恐怕你就走运了。在Java中,无法同时声明变量并调用其上的
void
函数。我还没有探索lambda方法。我只是尝试了一下,lambda方法是有问题的,因为
load
会抛出
IOException
。否则,这就是它作为Lambda的样子,带有optional(类似于derpy):
Properties=optional.of(newproperties()).map(p->{p.load(newfileinputstream(“credentials.Properties”);return p;}.get()我喜欢这个解决方案。略重于预期,但稍作修改(我编辑了您的答案),它适用于两种语言。谢谢我们怎样才能用它来关闭小溪?据我所知,propertes.load在加载后不会关闭流。我希望我没有错过什么
Properties credentials = Optional.of(new Properties()).map(p -> { p.load(new FileInputStream("credentials.properties")); return p; }).get();
var credentials = java.util.Optional.of(new java.util.Properties()).map(function(p) { p.load(new java.io.FileInputStream("credentials.properties")); return p;}).get();