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) |