Используя метод 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, являются их собственными. |