天天看點

java stream擷取map泛型集合的keyset_怎麼在java 8的map中使用stream

簡介

Map是java中非常常用的一個集合類型,我們通常也需要去周遊Map去擷取某些值,java 8引入了Stream的概念,那麼我們怎麼在Map中使用Stream呢?

基本概念

Map有key,value還有表示key,value整體的Entry。

建立一個Map:

Map<String, String> someMap = new HashMap<>();
           

擷取Map的entrySet:

Set<Map.Entry<String, String>> entries = someMap.entrySet();
           

擷取map的key:

Set<String> keySet = someMap.keySet();
           

擷取map的value:

Collection<String> values = someMap.values();
           

上面我們可以看到有這樣幾個集合:Map,Set,Collection。

除了Map沒有stream,其他兩個都有stream方法:

Stream<Map.Entry<String, String>> entriesStream = entries.stream();
        Stream<String> valuesStream = values.stream();
        Stream<String> keysStream = keySet.stream();
           

我們可以通過其他幾個stream來周遊map。

使用Stream擷取map的key

我們先給map添加幾個值:

someMap.put("jack","20");
someMap.put("bill","35");
           

上面我們添加了name和age字段。

如果我們想查找age=20的key,則可以這樣做:

Optional<String> optionalName = someMap.entrySet().stream()
                .filter(e -> "20".equals(e.getValue()))
                .map(Map.Entry::getKey)
                .findFirst();

        log.info(optionalName.get());
           

因為傳回的是Optional,如果值不存在的情況下,我們也可以處理:

optionalName = someMap.entrySet().stream()
                .filter(e -> "Non ages".equals(e.getValue()))
                .map(Map.Entry::getKey).findFirst();

        log.info("{}",optionalName.isPresent());
           

上面的例子我們通過調用isPresent來判斷age是否存在。

如果有多個值,我們可以這樣寫:

someMap.put("alice","20");
        List<String> listnames = someMap.entrySet().stream()
                .filter(e -> e.getValue().equals("20"))
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());

        log.info("{}",listnames);
           

上面我們調用了collect(Collectors.toList())将值轉成了List。

使用stream擷取map的value

上面我們擷取的map的key,同樣的我們也可以擷取map的value:

List<String> listAges = someMap.entrySet().stream()
                .filter(e -> e.getKey().equals("alice"))
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());

        log.info("{}",listAges);
           

上面我們比對了key值是alice的value。

總結

Stream是一個非常強大的功能,通過和map相結合,我們可以更加簡單的操作map對象。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/stream-formap

歡迎關注我的公衆号:程式那些事,更多精彩等着您! 更多内容請通路

怎麼在java 8的map中使用stream​www.flydean.com

java stream擷取map泛型集合的keyset_怎麼在java 8的map中使用stream