如何使用Java 8和lambdas打印JVM的系统属性?

时间:2014-11-05 00:57:43

标签: java lambda java-8

您可以使用System.getProperties()获取JVM属性的Properties实例;您将如何使用Java 8代码将所有属性打印到控制台?

5 个答案:

答案 0 :(得分:8)

一个解决方案:

public final class Foo
{
    private static void printProperty(final Object key, final Object value)
    {
        System.out.println(key + ": " + value);
    }

    public static void main(final String... args)
    {
        System.getProperties().forEach(Foo::printProperty);
    }
}

流程:

  • Properties扩展了Hashtable<Object, Object>,它自己实现了Map<Object, Object>;
  • Map有一个.forEach()方法,其参数为BiConsumer;
  • BiConsumerfunctional interface;
  • printProperty()的静态方法Foo碰巧与BiConsumer<Object, Object>具有相同的签名:其“返回值”为void,其第一个参数为{{1 },它的第二个参数是Object;
  • 因此我们可以使用Object作为方法参考。

较短的版本是:

Foo::printProperty

在运行时,这不会产生任何影响。请注意第二个示例中的类型推断:编译器可以推断public final class ShorterFoo { public static void main(final String... args) { System.getProperties() .forEach((key, value) -> System.out.println(key + ": " + value)); } } key的类型为value。写这个“匿名lambda”的另一种方法是:

Object

(不是这样)旁注:即使它有点过时,你真的想看this video(是的,这是一个小时长;是的,值得一看。)


(不是这样)旁注2:您可能已注意到Map's .forEach() mentions a default implementation;这意味着您的自定义(Object key, Object value) -> System.out.println(key + ": " + value) 实现或外部库的其他实现将能够使用Map(例如,Guava的.forEach())。存在许多关于Java集合的此类方法;不要犹豫,对“老狗”使用这些“新方法”。

答案 1 :(得分:5)

@fge错过了一个非常短的版本,这个版本肯定取决于toString Map.Entry的实现。

public class VeryShortFoo {
    public static void main(String... args) {
        System.getProperties().entrySet().forEach(System.out::println);
    }
}
  • 此处,entrySet已进行流式处理,每个Map.Entry都会打印时引用out.println
  • Map.Entry toString的实现通常会返回getKey() + "=" + getValue()

这是我非常喜欢的另一个。

public class ElegantFoo {
    public static void main(String... args) {
        System.getProperties().entrySet().stream()
            .map(e -> e.getKey() + ": " + e.getValue())
            .forEach(System.out::println);
    }
}
  • entrySet再次流式传输(此时显式调用stream)。
  • Stream#map执行从一种类型的元素到另一种类型的元素的1:1转换。在此,它将Stream<Map.Entry>转换为Stream<String>
  • 打印Stream<String>

答案 2 :(得分:0)

在Java 8中,Properties类继承了名为HashTable的{​​{1}}的新方法。这个新方法接受函数(功能接口)作为参数传递给它。更具体地说,它接受功能接口forEach。该功能界面的功能方法BiConsumer<T,U>。在Java 8中,所有功能接口都可以写为Lambda表达式。因此,以下是我们如何在accept(T t, U u)实例中显示所有属性:

Property

答案 3 :(得分:0)

按顺序排序(使其有用)

printProperties(System.getProperties());

public static void printProperties(Properties properties) {
    new TreeSet<>(properties.keySet()).forEach((k) -> {
        System.out.println(k + " : " + properties.get(k));
    });
}

答案 4 :(得分:0)

System.getProperties().list(System.out);