2017-04-04 26 views
3

有人可以帮助我通过数据流和过滤获取地图值的数组吗?Java 8将地图的值检索到流和过滤器的数组

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)); 
    } 
} 

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

TheMap("jane", "engineer") 
TheMap("john", "engineer") 

基本上,检索TheMapnone-null名称和title

+3

这是奇怪的,你把一个覆盖地图到另一个地图?你确定你要这么做吗?你不想要一个只有名称和标题属性的bean吗? –

回答

2

如果你需要的TheMap的ArrayList,请尝试以下方法:

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))); 
+3

并不能保证返回的List实际上是一个ArrayList,所以你的演员可能在未来的发行版中打破。 'Collectors.toCollection'就是你想要的这种情况 – Eugene

+0

@Holger。对不起,我应该更加关注过滤器,看看它只是过滤出空值,而不是值内的键/值。看我的编辑。 – VHS

+0

@Eugene,根据[源代码](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/stream/Collectors.java# Collectors.toList'的Collectors.toList%28%29),它实际上实例化并返回一个'ArrayList'。我错过了什么? – VHS

3
List<Map<String, String>> list = 
     map.values().stream().filter(v -> 
           v != null && 
           !v.entrySet().isEmpty() && 
           !v.containsValue(null)). 
     collect(Collectors.toList()); 
+2

'v.entrySet()。isEmpty()'是什么意思?这不会产生与'v.isEmpty()'不同的结果。除此之外,空映射不在OP的问题描述之内。 – Holger

+0

都产生相同的结果。我原来的问题陈述并未包含空白的地图,但它有好处。这样,当我添加一个构造函数TheMap(){}时,逻辑仍然可以工作。 –

+0

我可以在这里发布后续问题吗?我有代码根据Map 搜索List 。就像知道我的代码是否好。 Map srch = new HashMap <>(); srch.put(“name”,“jane”); List > fnd = list.stream()。filter(e - > {boolean f = true; for(Entry s:srch.entrySet())f&=(e。 get(s.getKey())== s.getValue()); return f;})。collect(Collectors.toList()); –