Java 8-Lambda表达式和流迭代HashMap的HashMap

Abh*_*ary 0 java lambda java-8 java-stream

我需要使用lambda表达式迭代HashMap的HashMap并过滤掉一些不需要的条目.我尝试了一些方法,但似乎没有用.以下是地图的结构.

Map<String, Map<Date, String>> sensor_tags = new HashMap<String, Map<Date,String>>();
Run Code Online (Sandbox Code Playgroud)

从这张地图中,我需要删除传感器数据早于特定日期的条目(日期是内部地图的关键).以下是地图sensor_tags-的示例数据

String tagName = "zoneSensor";
Map<Date, String> values= new HashMap<Date, String>();

// (1st entry for tag 1) --> date is day before yesterday
Calendar datekey1 = Calendar.getInstance();
datekey1.set(2018, 12, 01, 12, 30, 45);
values.put(datekey1.getTime(), "ON");

// (2nd entry for tag 1) --> date is yesterdys date
Calendar datekey = Calendar.getInstance();
datekey.set(2018, 12, 02, 12, 30, 45);
values.put(datekey.getTime(), "OFF");

// (3rd entry for tag 1) --> date is today
Calendar instance = Calendar.getInstance();
instance.set(2018, 12, 03, 12, 30, 45);
values.put(instance.getTime(), "ON");

//(4th entry for tag 1)--> date is today + 10 sec
instance.add(Calendar.MILLISECOND, 10000);
sensor_tags.put(tagName, values);

values.put(instance.getTime(), "ON");
sensor_tags.put(tagName, values);

// 5th entry for tag2
tagName = "zoneSensor1";
values= new HashMap<Date, String>();
values.put(Calendar.getInstance().getTime(), "NORMAL");
sensor_tags.put(tagName, values);

//code in java 7
for (final Entry<String, Map<Date, String>> entry : sensor_tags.entrySet()) {
            final Iterator<Date> iter = entry.getValue().keySet().iterator();
            while (iter.hasNext()) {
                final Date date = iter.next();
                if (date.before(givendate)) {
                    iter.remove();
                }
        }
}

// code tried in java 8 (I am a beginner here :-) )
 sensor_tags
            .entrySet()
            .stream()
            .map(Map.Entry::getValue) // get an inner map
            .filter(value -> ((Date)value).before(datekey.getTime()));
Run Code Online (Sandbox Code Playgroud)

如何迭代并过滤内部地图的数据?此外,一旦数据被过滤,我需要按原样保留地图的结构,因此Map<String, Map<Date, String>>只需要收集输出.

shm*_*sel 5

如果要修改现有地图,则不需要流.只需循环并调用removeIf():

sensor_tags.values().forEach(
        m -> m.keySet().removeIf(datekey.getTime()::after));
Run Code Online (Sandbox Code Playgroud)