Статьи

Примеры Java 8 map (), flatMap ()

Используя метод map ()

При программировании очень распространена обработка данных для сбора некоторой информации из наборов объектов.

Допустим, мы хотели выяснить города у всех сотрудников конкретной компании. Наш класс сотрудников будет следующим.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Employee {
  
    private String name;
    private Integer age;
    private String city;
    private String state;
    private Department department;
  
    public String getCity() {
         return city;
    }
 
    public void setCity(String city) {
         this.city = city;
    }
 
    public String getState() {
         return state;
    }
 
    public void setState(String state) {
        this.state = state;
    }
}

Я не включил все атрибуты для класса Employee , но какой мне нужен атрибут city в этом случае.

Итак, теперь у нас есть список объектов Employee, и нам нужно найти разные города. Давайте рассмотрим подход до Java 8. Надеемся, что вы напишете следующий код, чтобы получить разные города.

1
2
3
4
5
List<Employee> employeeList = .....
Set<String> cities = new HashSet<String>();
for (Employee emp : employeeList) {
    cities.add(emp.getCity());
}

Интерфейс Java 8 Stream представляет метод map() который принимает функцию в качестве аргумента. Эта функция применяется к каждому элементу в потоке и возвращает новый поток. Код будет выглядеть следующим образом.

1
2
3
4
5
List<Employee> employeeList = new ArrayList<Employee>();
List<String> cities = employeeList.stream()
                                  .map(Employee::getCity)
                                  .distinct()
                                  .collect(Collectors.toList());

Использование метода flatMap ()

Интерфейс Java 8 Stream представляет flatMap() который можно использовать для объединения или объединения нескольких потоков в один поток.

Давайте возьмем пример. Предположим, мы хотели отфильтровать отдельные слова в текстовом файле. Посмотрите на следующий текстовый файл.

1
2
Sri Lanka is a beautiful country in Indian ocean.
It is totally surrounded by the sea.

В Java 8 мы можем прочитать текстовый файл, используя одну строку, и он вернет поток строки. Каждый элемент потока будет одной строкой текстового файла.

1
Stream<String> lineStream = Files.lines(Paths.get("data.txt"), Charset.defaultCharset());

Если вы видите результат вышеприведенного кода, печатая Stream ‘lineStream’, это будут строки текстового файла.

Затем мы можем преобразовать каждый элемент вышеупомянутого потока в поток слов. Затем мы можем использовать flatMap() чтобы объединить все потоки слов в один поток. Если мы выполним следующий код для каждого элемента потока lineStream , мы получим два потока слов. Смотрите следующий код.

1
line -> Arrays.stream(line.split(" "))

Два потока слов будут следующими.

1
2
Stream 1 : [SriLanka][is][a][beautiful][country][in][Indian][ocean.]}
Stream 2 : [It][is][totally][surrounded][by][the][sea.]

Метод flatMap() может объединить эти два в один поток слова следующим образом.

1
Stream<String> wordStream = lineStream.flatMap(line -> Arrays.stream(line.split(" ")));

Если вы напечатаете элементы вышеупомянутого wordStream , это будут все слова текстового файла. Но все равно вы увидите повторяющиеся слова. Вы можете использовать метод distinct() чтобы избежать дубликатов. Вот окончательный код.

1
2
3
List<String> wordStream = lineStream.flatMap(line -> Arrays.stream(line.split(" ")))
                                    .distinct()
                                    .collect(Collectors.toList());

Если вы внимательно посмотрите, вы можете найти отдельные слова текстового файла, просто используя две строки кода с Java 8.

Опубликовано на Java Code Geeks с разрешения Семики Калуге, партнера нашей программы JCG. Смотрите оригинальную статью здесь: примеры Java 8 map (), flatMap ()

Мнения, высказанные участниками Java Code Geeks, являются их собственными.