[Java 8] Sử dụng stream.filter() để lọc dữ liệu trong Map

Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách lọc (Filter) dữ liệu của 1 Map trong Java 8

Trước Java 8

Java:
    Map<Integer, String> map = new HashMap<>();

    map.put(1, "linode.com");

    map.put(2, "heroku.com");

       

    String result = "";

    for (Map.Entry<Integer, String> entry : map.entrySet()) {

        if("something".equals(entry.getValue())){

            result = entry.getValue();

        }

    }
Với Java 8, chuyển Map.entrySet() vào trong 1 stream, tiếp theo là filter() và collect() nó

Java:
     Map<Integer, String> map = new HashMap<>();
    map.put(1, "linode.com");
    map.put(2, "heroku.com");
   
    //Map -> Stream -> Filter -> String
    String result = map.entrySet().stream()
        .filter(x -> "something".equals(x.getValue()))
        .map(x->x.getValue())
        .collect(Collectors.joining());

    //Map -> Stream -> Filter -> MAP
    Map<Integer, String> collect = map.entrySet().stream()
        .filter(x -> x.getKey() == 2)
        .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
       
    // or like this
    Map<Integer, String> collect = map.entrySet().stream()
        .filter(x -> x.getKey() == 3)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

1. Java 8 – Lọc (filter) dữ liệu trong Map
Ví dụ về lọc một Map theo value và trả về String

TestMapFilter.java
Java:
package com.mkyong;



import java.util.HashMap;

import java.util.Map;

import java.util.stream.Collectors;



public class TestMapFilter {



    public static void main(String[] args) {



        Map<Integer, String> HOSTING = new HashMap<>();

        HOSTING.put(1, "linode.com");

        HOSTING.put(2, "heroku.com");

        HOSTING.put(3, "digitalocean.com");

        HOSTING.put(4, "aws.amazon.com");



        // Before Java 8

        String result = "";

        for (Map.Entry<Integer, String> entry : HOSTING.entrySet()) {

            if ("aws.amazon.com".equals(entry.getValue())) {

                result = entry.getValue();

            }

        }

        System.out.println("Before Java 8 : " + result);



        //Map -> Stream -> Filter -> String

        result = HOSTING.entrySet().stream()

                .filter(map -> "aws.amazon.com".equals(map.getValue()))

                .map(map -> map.getValue())

                .collect(Collectors.joining());



        System.out.println("With Java 8 : " + result);



        // filter more values

        result = HOSTING.entrySet().stream()

                .filter(x -> {

                    if (!x.getValue().contains("amazon") && !x.getValue().contains("digital")) {

                        return true;

                    }

                    return false;

                })

                .map(map -> map.getValue())

                .collect(Collectors.joining(","));



        System.out.println("With Java 8 : " + result);



    }



}
Kết quả
Code:
Before Java 8 : aws.amazon.com

With Java 8 : aws.amazon.com

With Java 8 : linode.com,heroku.com

2. Java 8 – Lọc (filter) dữ liệu trong Map #2
Một ví dụ khác về lọc một Map bằng key, thế nhưng lần này sẽ trả về một Map.

TestMapFilter2.java
Java:
package com.mkyong;



import java.util.HashMap;

import java.util.Map;

import java.util.stream.Collectors;



public class TestMapFilter2 {



    public static void main(String[] args) {



        Map<Integer, String> HOSTING = new HashMap<>();

        HOSTING.put(1, "linode.com");

        HOSTING.put(2, "heroku.com");

        HOSTING.put(3, "digitalocean.com");

        HOSTING.put(4, "aws.amazon.com");



        //Map -> Stream -> Filter -> Map

        Map<Integer, String> collect = HOSTING.entrySet().stream()

                .filter(map -> map.getKey() == 2)

                .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));



        System.out.println(collect); //output : {2=heroku.com}



        Map<Integer, String> collect2 = HOSTING.entrySet().stream()

                .filter(map -> map.getKey() <= 3)

                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));



        System.out.println(collect2); //output : {1=linode.com, 2=heroku.com, 3=digitalocean.com}



    }



}
Kết quả
Code:
{2=heroku.com}

{1=linode.com, 2=heroku.com, 3=digitalocean.com}

3. Java 8 – Lọc (filter) dữ liệu trong Map #3 – Predicate
Lần này, thử với Java 8 Predicate mới

TestMapFilter3.java
Java:
package com.mkyong;



import java.util.HashMap;

import java.util.Map;

import java.util.function.Predicate;

import java.util.stream.Collectors;



public class TestMapFilter3 {



    // Generic Map filterbyvalue, with predicate

    public static <K, V> Map<K, V> filterByValue(Map<K, V> map, Predicate<V> predicate) {

        return map.entrySet()

                .stream()

                .filter(x -> predicate.test(x.getValue()))

                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

    }



    public static void main(String[] args) {



        Map<Integer, String> HOSTING = new HashMap<>();

        HOSTING.put(1, "linode.com");

        HOSTING.put(2, "heroku.com");

        HOSTING.put(3, "digitalocean.com");

        HOSTING.put(4, "aws.amazon.com");

        HOSTING.put(5, "aws2.amazon.com");



        //  {1=linode.com}

        Map<Integer, String> filteredMap = filterByValue(HOSTING, x -> x.contains("linode"));

        System.out.println(filteredMap);



        // {1=linode.com, 4=aws.amazon.com, 5=aws2.amazon.com}

        Map<Integer, String> filteredMap2 = filterByValue(HOSTING, x -> (x.contains("aws") || x.contains("linode")));

        System.out.println(filteredMap2);



        // {4=aws.amazon.com}

        Map<Integer, String> filteredMap3 = filterByValue(HOSTING, x -> (x.contains("aws") && !x.contains("aws2")));

        System.out.println(filteredMap3);



        // {1=linode.com, 2=heroku.com}

        Map<Integer, String> filteredMap4 = filterByValue(HOSTING, x -> (x.length() <= 10));

        System.out.println(filteredMap4);



    }



}
Kết quả
Code:
{1=linode.com}

{1=linode.com, 4=aws.amazon.com, 5=aws2.amazon.com}

{4=aws.amazon.com}

{1=linode.com, 2=heroku.com}


Cám ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong các bài viết sau :)

Bài viết tham khảo tại: https://mkyong.com/java8/java-8-filter-a-map-examples
 
Sửa lần cuối:

Bình luận