Java 8 使用流和过滤器将 Map 的值检索到数组中

TX *_*X T 5 java-8 java-stream

有人会帮助我通过流和过滤获取地图值的数组吗?

public class TheMap extends HashMap<String, String> {
    public TheMap(String name, String title) {
        super.put("name", name);
        super.put("title", title);
    }

    public static void main(final String[] args) {
        Map<Long, Map<String, String>>map = new HashMap<>();            

        map.put(0L, null);
        map.put(1L, new TheMap("jane", "engineer"));
        map.put(2L, new TheMap("john", "engineer"));
        map.put(3L, new TheMap(null, "manager"));
        map.put(4L, new TheMap("who", null));
        map.put(5L, new TheMap(null, null));
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的结果是ArrayList<TheMap>只有这两个条目:

TheMap("jane", "engineer")
TheMap("john", "engineer")
Run Code Online (Sandbox Code Playgroud)

基本上,TheMap使用none-nullname 和 进行检索title

VHS*_*VHS 3

如果您需要 arrayList TheMap,请尝试以下方式:

ArrayList<TheMap> as = map.values()
   .stream()
   .filter(v -> v != null && v.get("name") != null && v.get("title") != null)
   .map(m -> (TheMap)m)
   .collect(Collectors.toCollection(ArrayList::new)));
Run Code Online (Sandbox Code Playgroud)

  • 不能保证返回的 List 实际上是 ArrayList,因此您的转换可能会在将来的版本中中断。在这种情况下,“Collectors.toCollection”就是您想要的 (3认同)
  • @VHS,您没有遗漏任何内容,但这正是导致实现细节可能发生变化的原因。查看“toList”的 javadoc 以及它*不做*的保证。 (2认同)