Java Map 經過 key 或者 value 過濾

今天寫根過濾的時候一會兒有點愣眼,先是想到用 Java 原生的 map 循環查出來,可是以爲太 low, 後面思考了一下能夠用 Java8 的 Lambda,寫完了,又發現 Google Guava 有現成的方法,這裏一一列出來,供參考使用。java

首先提示,若是照搬個人代碼的話別忘了引這些依賴微信

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>25.1-jre</version>
        </dependency>
</dependencies>

filter by key

public class FilterMapByKeyTest {
    private Map<Integer, String> WEEK = new HashMap<>();

    @Before
    public void setUp () {
        WEEK.put(1, "Monday");
        WEEK.put(2, "Tuesday");
        WEEK.put(3, "Wednesday");
        WEEK.put(4, "Thursday");
        WEEK.put(5, "Friday");
        WEEK.put(6, "Saturday");
        WEEK.put(7, "Sunday");
    }

    /**
     * Java 8以前的版本
     */
    @Test
    public void filterMapByKey () {
        Map<Integer, String> map = new HashMap<>();
        for (Map.Entry<Integer, String> entry : WEEK.entrySet()) {
            if (entry.getKey() <= 3) {
                map.put(entry.getKey(), entry.getValue());
            }
        }
        assertThat(map.keySet(), contains(1, 2, 3));
    }

    /**
     * Java 8 Lambda
     */
    @Test
    public void filterMapByKeyJava8Lambda () {
        Map<Integer, String> map = WEEK.entrySet().stream().filter(r -> r.getKey() <= 3)
                        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        assertThat(map.keySet(), contains(1, 2, 3));
    }

    /**
     * Google Guava
     */
    @Test
    public void filterMapByKeyGuava () {
        Map<Integer, String> map = Maps.filterKeys(WEEK, r -> r <= 3);
        assertThat(map.keySet(), contains(1, 2, 3));
    }

}

filter by value

public class FilterMapByValueTest {
    private Map<Integer, String> WEEK = new HashMap<>();

    @Before
    public void setUp () {
        WEEK.put(1, "Monday");
        WEEK.put(2, "Tuesday");
        WEEK.put(3, "Wednesday");
        WEEK.put(4, "Thursday");
        WEEK.put(5, "Friday");
        WEEK.put(6, "Saturday");
        WEEK.put(7, "Sunday");
    }

    /**
     * Java 8以前的版本
     */
    @Test
    public void filterMapByValue () {
        Map<Integer, String> map = new HashMap<>();
        for (Map.Entry<Integer, String> entry : WEEK.entrySet()) {
            if (entry.getValue().startsWith("S")) {
                map.put(entry.getKey(), entry.getValue());
            }
        }
        assertThat(map.values(), contains("Saturday","Sunday"));
    }

    /**
     * Java 8 Lambda
     */
    @Test
    public void filterMapByValueJava8Lambda () {
        Map<Integer, String> map = WEEK.entrySet().stream().filter(r -> r.getValue().startsWith("S"))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        assertThat(map.values(), contains("Saturday","Sunday"));
    }

    /**
     * Google Guava
     */
    @Test
    public void filterMapByValueGuava () {
        Map<Integer, String> map = Maps.filterValues(WEEK, r -> r.startsWith("S"));
        assertThat(map.values(), contains("Saturday","Sunday"));
    }
}

若是以爲內容還不錯,能夠關注一下我哦
微信公衆號:志哥 (ID: zhige-me)
期待與你相遇,一同成長前行!
微信公衆號:志哥 (ID: zhige-me)google

相關文章
相關標籤/搜索