Download - Мифы и легенды Java Stream API
![Page 1: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/1.jpg)
Мифы и легендыДревней Греции
Java Stream API
Зураб Белый Рексофт 2016
![Page 2: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/2.jpg)
Не верьте мне. Проверяйте всё сами.
Дисклеймер
![Page 3: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/3.jpg)
Миф №1: “Stream API только для коллекций”
![Page 4: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/4.jpg)
Stream из коллекций
Collection objects = ...;
objects.stream();
objects.parallelStream();
![Page 5: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/5.jpg)
Stream из массивов
int[] array = new int[0];
Arrays.stream(array);
![Page 6: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/6.jpg)
Stream из строк
"Тут могла быть ваша реклама".chars();
Pattern.compile("^[0-9]+[А-Яа-я]{2}").splitAsStream("Тут тоже могла быть ваша реклама");
![Page 7: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/7.jpg)
Stream из vararg
Stream.of(object);
Stream.of(object1, object2, object3, object4);
Stream.builder().add(object1).add(object2).build();
![Page 8: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/8.jpg)
Генераторы стримов
Stream.iterate(0, i -> i++);
Stream.generate(() -> Math.random() % 123);
![Page 9: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/9.jpg)
Stream из потоков и файлов
Files.lines("/usr/local/java/tutorial.txt");
Reader reader = ...;new BufferedReader(reader).lines();
new JarFile("pokmeonOG.jar").stream();
![Page 10: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/10.jpg)
Stream повсюду...
new Random().ints();
new BitSet().stream();
![Page 11: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/11.jpg)
Миф №1: “Stream API только для коллекций”
![Page 12: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/12.jpg)
Тестовый стенд
@State(Scope.Benchmark)@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.MICROSECONDS)@Warmup(iterations = 20)@Measurement(iterations = 30)@OperationsPerInvocation(1000)@Fork(10)
![Page 13: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/13.jpg)
Миф №2: “Stream быстрее цикла”
![Page 14: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/14.jpg)
@Benchmarkpublic List<String> loop(List<String> strings) { List<String> newStrings = new ArrayList<>(); for (String str : strings) { if (str.indexOf("1") > 3) { newStrings.add(
str.toUpperCase().substring(0, 3) ); } } return newStrings;}
![Page 15: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/15.jpg)
@Benchmarkpublic List<String> stream(List<String> strings) { return strings .stream() .filter(str -> str.indexOf("1") > 3) .map(str -> str.toUpperCase().substring(0, 3)) .collect(Collectors.toList());}
![Page 16: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/16.jpg)
Benchmark | Items |Samples| Score|Score error|Units----------|-------|-------|------|-----------|----- loop |100 000| 300|10,376| 0,063|µs/op----------|-------|-------|------|-----------|----- stream |100 000| 300|10,582| 0,074|µs/op
![Page 17: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/17.jpg)
@Benchmarkpublic List<String> stream(List<String> strings) { return strings .stream() .parallel() .filter(str -> str.indexOf("1") > 3) .map(str -> str.toUpperCase().substring(0, 3)) .collect(Collectors.toList());}
![Page 18: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/18.jpg)
Benchmark | Items |Samples| Score|Score error|Units----------|-------|-------|------|-----------|----- loop |100 000| 300|10,376| 0,063|µs/op----------|-------|-------|------|-----------|----- stream |100 000| 300|10,582| 0,074|µs/op----------|-------|-------|------|-----------|----- parallel |100 000| 300| 3,423| 0,097|µs/op
![Page 19: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/19.jpg)
Миф №2: “Stream быстрее цикла”
![Page 20: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/20.jpg)
Миф №3: “Оптимизировать код можно добавлением .parallel()”
![Page 21: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/21.jpg)
![Page 22: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/22.jpg)
java.util.Iterator<E>
![Page 23: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/23.jpg)
java.util.Iterator<E>
![Page 24: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/24.jpg)
java.util.Spliterator<T>
![Page 25: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/25.jpg)
java.util.Spliterator<T>
![Page 26: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/26.jpg)
java.util.Spliterator<T>
![Page 27: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/27.jpg)
@Benchmarkpublic List<String> top10Users(List<User> users) { return users .stream()
// .parallel() .distinct() .sorted() .limit(10) .map(Objects::toString) .collect(Collectors.toList());}
![Page 28: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/28.jpg)
public class User implements Comparable { private long id, count; ... public boolean equals(Object o) { if (this == o) return true;
else if (!(o instanceof User)) return false; else return id == ((User) o).id; } public int compareTo(Object o) { long count2 = ((User) o).getCount(); if (count > count2) return 1; else if (count == count2) return 0; else return -1 }}
![Page 29: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/29.jpg)
Benchmark | Items|Samples| Score |Score error|Units----------|-------|-------|---------|-----------|----- simple |100 000| 300| 82,199| 0,728|us/op----------|-------|-------|---------|-----------|----- parallel |100 000| 300| 53,882| 0,294|us/op
![Page 30: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/30.jpg)
.distinct() .sorted() .limit() .collect() ...
java.util.Spliterator<T>
![Page 31: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/31.jpg)
Benchmark | Items|Samples| Score |Score error|Units----------|-------|-------|---------|-----------|----- simple |100 000| 300| 82,199| 0,728|us/op----------|-------|-------|---------|-----------|----- parallel |100 000| 300| 53,882| 0,294|us/op----------|-------|-------|---------|-----------|----- simple | 100| 300| 0,033| 0,000|us/op----------|-------|-------|---------|-----------|----- parallel | 100| 300| 0,105| 0,002|us/op
![Page 32: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/32.jpg)
Benchmark | Items|Samples| Score |Score error|Units----------|-------|-------|---------|-----------|----- simple |100 000| 300| 82,199| 0,728|us/op----------|-------|-------|---------|-----------|----- parallel |100 000| 300| 53,882| 0,294|us/op----------|-------|-------|---------|-----------|----- simple | 100| 300| 0,033| 0,000|us/op----------|-------|-------|---------|-----------|----- parallel | 100| 300| 0,105| 0,002|us/op----------|-------|-------|---------|-----------|----- simple | 10m| 300|15731,075| 337,593|us/op----------|-------|-------|---------|-----------|----- parallel | 10m| 300|17065,969| 596,584|us/op
![Page 33: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/33.jpg)
Миф №3: “Оптимизировать код можно добавлением .parallel()”
![Page 34: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/34.jpg)
Миф №4: “Класс источника стрима прямо не влияет на скорость”
![Page 35: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/35.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 36: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/36.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 37: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/37.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 38: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/38.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 39: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/39.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 40: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/40.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 41: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/41.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 42: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/42.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 43: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/43.jpg)
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
![Page 44: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/44.jpg)
![Page 45: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/45.jpg)
Benchmark | Items|Samples| Score|Score error|Units----------|-------|-------|-------|-----------|----- simple |100 000| 300| 0,005| 0,000|us/op----------|-------|-------|-------|-----------|----- parallel |100 000| 300| 0,850| 0,009|us/op
Benchmark | Items|Samples| Score|Score error|Units----------|-------|-------|-------|-----------|----- simple |100 000| 300| 82,199| 0,728|us/op----------|-------|-------|-------|-----------|----- parallel |100 000| 300| 53,882| 0,294|us/op
![Page 46: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/46.jpg)
Миф №4: “Класс источника стрима прямо не влияет на скорость”
![Page 47: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/47.jpg)
Миф №5: “Параллельный стрим выполняет лишние операции”
![Page 48: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/48.jpg)
Stream .of(1, 2, 3, 4, 5, 6) .map(i -> { System.out.println("Map " + i); return i; }) .filter(i -> { System.out.println("Filter " + i); return true; }) .limit(3) .forEach(i -> System.out.println("ForEach " + i));
![Page 49: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/49.jpg)
Map 1Filter 1ForEach 1Map 2Filter 2ForEach 2Map 3Filter 3ForEach 3
Обычный стрим
![Page 50: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/50.jpg)
Map 1Map 3Map 4Map 2Filter 4Filter 3Filter 1Filter 2Map 5Map 6
Map 1Filter 1ForEach 1Map 2Filter 2ForEach 2Map 3Filter 3ForEach 3
Filter 5Filter 6ForEach 1ForEach 3ForEach 2
Обычный стрим Параллельный стрим
![Page 51: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/51.jpg)
Миф №5: “Параллельный стрим выполняет лишние операции”
![Page 52: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/52.jpg)
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
![Page 53: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/53.jpg)
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
![Page 54: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/54.jpg)
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
![Page 55: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/55.jpg)
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
![Page 56: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/56.jpg)
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
![Page 57: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/57.jpg)
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
![Page 58: Мифы и легенды Java Stream API](https://reader031.vdocuments.pub/reader031/viewer/2022021815/586fb3071a28abe57d8b6ae3/html5/thumbnails/58.jpg)
Спасибо за внимание!Вопросы?
@ZurabBelyi
BelyiZ