在Java 8中将属性过滤/排序到地图中

bob*_*sie 3 java lambda java-8 java-stream

我正在尝试在运行时读取Java系统属性,基于includes列表进行过滤(此处硬编码但通常通过属性文件注入),最后按键排序并转换为a Map<String, String>.这就是我提出的,但不确定它是否是最优雅的解决方案.

final List<String> includes = Arrays
    .asList("java.version", "PID", "os.name", "user.country");     // hard coded here but (usually defined in a properties file)

Map<String, String> systemMap = System.getProperties()
    .entrySet().stream()
    .filter(s -> includes != null && includes.contains(s.getKey()))
    .sorted(Comparator.comparing(
        Map.Entry::getKey, Comparator.comparing(e -> (String) e))
    )
    .collect(Collectors.toMap(
        e -> (String) e.getKey(), 
        e -> (String) e.getValue(),
        (e1, e2) -> e2, 
        LinkedHashMap::new)
    );
Run Code Online (Sandbox Code Playgroud)

我很想知道代码是否可以整理.

tob*_*s_k 5

如何扭转这一局面,并使用stream了的includes名单呢?这样,您不必一直解压缩那些映射条目,您可以使用sorted,如果includes只包含有效的属性,您可能甚至不需要filter.(另外,在地图中查找比列表中的查找更快,但这可能并不重要.)

Properties props = System.getProperties();
Map<String, String> systemMap = includes.stream()
    .filter(props::containsKey)
    .sorted()
    .collect(Collectors.toMap(s -> s, props::getProperty,
        (e1, e2) -> e2, 
        LinkedHashMap::new)
    );
Run Code Online (Sandbox Code Playgroud)