Java 8 Stream modifiers
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8.
В этой статье мы рассмотрим модификаторы Stream-ов в Java 8
1. Введение
Stream API - новый способ взаимодействия с данными, представляя их в виде конечного потока данных.
Stream-ы могут иметь различные модификаторы состояния, мы рассмотрим следующие : distinct, sorted, parallel, sequential
2. Distinct stream
Если мы хотим получить Stream уникальных элеметов, мы можем воспользоваться методом distinct().
Использование метода distinct() предполагает что элементы Stream-a реализовывают метод equals()
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<String> strings = Arrays.asList("a", "b", "c", "d", "a", "b"); strings.stream() .distinct() .forEach(System.out::println); //output a b c d } |
Если же класс не реализовывает метод equals(), метод distinct() не будет иметь смысла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class MainClass { public static void main(String[] args) { List<Person> people = Arrays.asList(new Person("Jo"), new Person("Jo"), new Person("Lui")); people.stream() .distinct() .forEach(System.out::println); //output {name='Jo'} {name='Jo'} {name='Lui'} } } class Person { private String name; Person(String name) { this.name = name; } @Override public String toString() { return "{name='" + name + '\'' + '}'; } //no equals & hashcode } |
3. Sorted stream
Если мы хотим получить сортированный Stream, мы можем использовать метод sorted().
Stream имеет два метода sorted(), один без параметров (подразумевает что класс реализует Comparable) второй принимает Comparator.
Создадим класс Person
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Person { private String name; Person(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "{name='" + name + '\'' + '}'; } } |
Теперь получим отсортированный Stream
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { List<Person> people = Arrays.asList(new Person("Jo"), new Person("Zai"), new Person("Lui")); people.stream() .sorted() .forEach(System.out::println); //java.lang.ClassCastException } |
Если элементы Stream-a не реализуют Comparable, мы получим ClassCastException при вызове sorted.
После реализации интерфейса все работает как нужно
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { List<Person> people = Arrays.asList(new Person("Jo"), new Person("Zai"), new Person("Lui")); people.stream() .sorted() .forEach(System.out::println); //output {name='Jo'} {name='Lui'} {name='Zai'} } |
Использование sorted и Comparator
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { List<Person> people = Arrays.asList(new Person("Jo"), new Person("Zai"), new Person("Lui")); people.stream() .sorted(Comparator.comparing(Person::getName).reversed()) //сортировка по имени в обратном порядке .forEach(System.out::println); //output {name='Zai'} {name='Lui'} {name='Jo'} } |
4. Parallel stream
Stream API поддерживает параллельное исполнение задач. Чтобы сделать Stream параллельным, нужно лишь вызвать метод parallel() или parallelStream() у коллекции
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<String> people = Arrays.asList("Jo", "Zai", "Lui", "Andy"); people.stream() .parallel() .forEach(System.out::println); //output Lui Zai Jo Andy } |
Или же
1 2 3 4 5 6 |
public static void main(String[] args) { List<String> people = Arrays.asList("Jo", "Zai", "Lui", "Andy"); people.parallelStream() .forEach(System.out::println); //output Lui Zai Jo Andy } |
На самом деле вывод будет разный каждый раз, Stream то параллельный, значит обрабатывать данные он будет в несколько потоков.
5. Sequential stream
Sequential stream это самый обычный (последовательный) Stream, метод sequential() был введен для того, чтобы из parallel можно было обратно получить sequential Stream.
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<String> people = Arrays.asList("Jo", "Zai", "Lui", "Andy"); people.parallelStream() .sequential() .forEach(System.out::println); //output Jo Zai Lui Andy } |
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Детальнее - у нас на сайте.