99 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | ||
| title: Streams
 | ||
| localeTitle: Streams
 | ||
| ---
 | ||
| # Streams
 | ||
| 
 | ||
| В Java 8 Streams добавлена новая функция Java toolbox. Потоки позволяют быстро и чисто обрабатывать коллекции.
 | ||
| 
 | ||
| Перед продолжением прочитайте главу о лямбдах и функциональном программировании.
 | ||
| 
 | ||
| ## Как это устроено
 | ||
| 
 | ||
| Поток обходит элементы коллекции для вас. Каждое промежуточное и терминальное действие вызывается для каждого объекта. После завершения всех операций для первых объектов, загружается второй объект.
 | ||
| 
 | ||
| ## Важные методы
 | ||
| 
 | ||
| ### Создание
 | ||
| 
 | ||
| *   `Collection.stream()` : создать поток из любого объекта из любого класса, реализующего `Collection`
 | ||
| *   `Arrays.stream(array)` : создать поток из массива
 | ||
| 
 | ||
| ### Промежуточные операции
 | ||
| 
 | ||
| Эти операции каким-то образом преобразуют объекты Stream.
 | ||
| 
 | ||
| *   `Stream.map(Function<In,Out> function)` : примените функцию для преобразования In to Out
 | ||
| *   `Stream.filter(Predicate<In> predicate)` : удалить объекты из потока, для которых предикат не проверяет true
 | ||
| *   `Stream.distinct()` : удалить объекты из потока, которые являются дубликатами
 | ||
| *   `Stream.sorted()` : сортировка объектов в потоке
 | ||
| *   `Stream.limit(int n)` : конец потока после n объектов
 | ||
| 
 | ||
| ### Терминальные операции
 | ||
| 
 | ||
| Эти операции принимают объекты Stream и завершают поток.
 | ||
| 
 | ||
| *   `Stream.collect(Collector<In,?,Out> collector)` : собирать все объекты в потоке в объект
 | ||
| *   `Stream.forEach(Consumer<In> consumer)` : потребляет все объекты в потоке, используя функцию пользователя
 | ||
| *   `Stream.count()` : считать все объекты в потоке
 | ||
| *   `Stream.findFirst()` : возвращает первый объект Stream и останавливается
 | ||
| *   `Stream.anyMatch(Predicate<In> predicate)` : возвращает true, если какой-либо объект в потоке проверяет true для предиката
 | ||
| *   `Stream.allMatch(Predicate<In> predicate)` : возвращает true, если весь объект в потоке test true для предиката
 | ||
| 
 | ||
| ## Примеры
 | ||
| 
 | ||
| ```java
 | ||
| // print the length of all Strings in a List 
 | ||
|  for (String string : Arrays.asList("abc", "de", "f", "abc")) { 
 | ||
|     int length = string.length(); 
 | ||
|     System.out.println(length); 
 | ||
|  } 
 | ||
|  
 | ||
|  Arrays.asList("abc", "de", "f", "abc") 
 | ||
|         .stream() 
 | ||
|         .map(String::length) 
 | ||
|         .forEach(System.out::println); 
 | ||
|  
 | ||
|  // output: 3 2 1 3 
 | ||
| ```
 | ||
| 
 | ||
| ```java
 | ||
| // print all Strings in a List with a Length greater than 2 
 | ||
|  for (String string : Arrays.asList("abc", "de", "f", "abc")) { 
 | ||
|     if (string.length() > 2) { 
 | ||
|         System.out.println(string); 
 | ||
|     } 
 | ||
|  } 
 | ||
|  
 | ||
|  Arrays.asList("abc", "de", "f", "abc") 
 | ||
|         .stream() 
 | ||
|         .filter(string -> string.length() > 2) 
 | ||
|         .forEach(System.out::println); 
 | ||
|  
 | ||
|  // output: abc abc 
 | ||
| ```
 | ||
| 
 | ||
| ```java
 | ||
| // create a sorted List with all unique Strings from another List which are longer than or requal 2 
 | ||
|  List<String> result = new ArrayList<>(); 
 | ||
|  for (String string : Arrays.asList("de", "abc", "f", "abc")) { 
 | ||
|     if (string.length() >= 2 
 | ||
|             && ! result.contains(string)) { 
 | ||
|         result.add(string); 
 | ||
|     } 
 | ||
|  } 
 | ||
|  Collections.sort(result); 
 | ||
|  
 | ||
|  List<String> result2 = Arrays.asList("de", "abc", "f", "abc") 
 | ||
|         .stream() 
 | ||
|         .filter(string -> string.length() >= 2) 
 | ||
|         .distinct() 
 | ||
|         .sorted() 
 | ||
|         .collect(Collectors.toList()); 
 | ||
|  
 | ||
|  // result: abc de 
 | ||
| ```
 | ||
| 
 | ||
| ### источники
 | ||
| 
 | ||
| 1.  [Обработка данных с помощью потоков Java SE 8, часть 1](http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html) |