SlideShare a Scribd company logo
Generics. Collections. Streams
Алексей Владыкин
public class TreeNode {
String value;
TreeNode left;
TreeNode right;
}
public static BigDecimal minElement(
BigDecimal [] values) {
if (values.length == 0) {
return null;
}
BigDecimal min = values [0];
for (int i = 1; i < values.length; i++) {
if (min.compareTo(values[i]) > 0) {
min = values[i];
}
}
return min;
}
TreeNode rootNode = new TreeNode ();
rootNode.value = "foobar";
// tree manipulation
String value = (String) rootNode.value;
Object [] arrayOfBigDecimals = {...};
BigDecimal min = (BigDecimal)
minElement(arrayOfBigDecimals );
public static <T extends Comparable <T>> T
minElement(T[] values) {
if (values.length == 0) {
return null;
}
T min = values [0];
for (int i = 1; i < values.length; i++) {
if (min.compareTo(values[i]) > 0) {
min = values[i];
}
}
return min;
}
TreeNode <String > stringNode;
TreeNode <Integer > integerNode;
TreeNode <int[]> intArrayNode;
TreeNode <int > intNode;
TreeNode <10> tenNode;
package java.util;
public final class Optional <T> {
private final T value;
private Optional(T value) {
this.value = Objects. requireNonNull (value );
}
public static <T> Optional <T> of(T value) {
return new Optional <>( value );
}
public T get () {
if (value == null) {
throw new NoSuchElementException ("No value present");
}
return value;
}
// ...
}
String text = ???; // is null allowed?
@Nullable String nullableText = null;
@NonNull String nonNullText = "hello!";
String text = "bar";
Optional <String > optionalText =
Optional.of("baz");
Optional <String > baz = Optional.of("baz");
baz.ifPresent(System.out:: println );
Optional <String > bar = Optional.empty ();
String value = bar.orElse("bar");
package java.util;
public final class Optional <T> {
private final T value;
private Optional(T value) {
this.value = Objects. requireNonNull (value );
}
public static <T> Optional <T> of(T value) {
return new Optional <>( value );
}
public T get () {
if (value == null) {
throw new NoSuchElementException ("No value present");
}
return value;
}
// ...
}
Optional <String > foo =
Optional.empty ();
Optional <String > bar =
Optional.of("bar");
Optional <String > baz =
Optional.ofNullable("baz");
Optional <CharSequence > optionalCharSequence =
Optional.<CharSequence >ofNullable("baz");
Optional <String > newOptional =
new Optional <>("foobar");
package java.util;
public final class Optional {
private final Object value;
private Optional(Object value) {
this.value = Objects. requireNonNull (value );
}
public static Optional of(Object value) {
return new Optional(value );
}
public Object get() {
if (value == null) {
throw new NoSuchElementException ("No value present");
}
return value;
}
// ...
}
Optional <String > optional = Optional.of("foo");
String value1 = optional.orElse("bar");
String value2 = optional.get ();
Optional optional = Optional.of("foo");
String value1 = (String) optional.orElse("bar");
String value2 = (String) optional.get ();
T obj = new T();
T[] arr = new T[5];
if (obj instanceof T) {...}
T a = (T) b;
import java.io.IOException ;
public class Hack {
public static void main(String [] args) {
throwAsUnchecked (new IOException ());
}
private static void throwAsUnchecked (Exception e) {
Hack.<RuntimeException > genericThrow (e);
}
private static <T extends Throwable >
void genericThrow (Exception e) throws T {
throw (T) e;
}
}
Number number = new Integer (1);
Number [] numberArray = new Integer [10];
Optional <Integer > optionalInt = Optional.of (1);
Optional <Number > optionalNumber = optionalInt;
optionalNumber.set(new BigDecimal("3.14"));
package java.util;
public final class Optional <T> {
private final T value;
public void ifPresent(Consumer <T> consumer) {
if (value != null)
consumer.accept(value );
}
public T orElseGet(Supplier <T> other) {
return value != null ? value : other.get ();
}
// ...
}
package java.util;
public final class Optional <T> {
private final T value;
public void ifPresent(Consumer <? super T> consumer) {
if (value != null)
consumer.accept(value );
}
public T orElseGet(Supplier <? extends T> other) {
return value != null ? value : other.get ();
}
// ...
}
Optional <?> optional = Optional.of (1);
Object value1 = optional.get ();
Object value2 = optional.orElse (2);
int[] oldArray = ...;
int oldLength = oldArray.length;
int newLength = oldLength + 10;
int[] newArray =
Arrays.copyOf(oldArray , newLength );
newArray[oldLength] = newElement1;
newArray[oldLength + 1] = newElement2;
// ...
final int[] array = new int[] {1, 2, 3};
array [0] = 10;
array [1] = 11;
array [2] = 12;
package java.util;
public interface Collection <E>
extends Iterable <E> {
int size ();
boolean isEmpty ();
boolean contains(Object o);
boolean add(E e);
boolean remove(Object o);
void clear ();
// ...
}
Collection <ComplexNumber > c = ...;
c.add(new ComplexNumber (1, 2));
boolean contains =
c.contains(new ComplexNumber (1, 2));
Collection <Integer > collection = ...;
Iterator <Integer > it = collection.iterator ();
while (it.hasNext ()) {
Integer element = it.next ();
System.out.println(element );
}
for (Integer element : collection) {
System.out.println(element );
}
Collection <Integer > collection = ...;
collection.forEach(System.out:: println );
Collection <Integer > collection = ...;
for (Integer number : collection) {
if (number > 5) {
collection.remove(number );
}
}
// java.util. ConcurrentModificationException
package java.util;
public interface List <E> extends Collection <E> {
E get(int index );
E set(int index , E element );
void add(int index , E element );
E remove(int index );
int indexOf(Object o);
int lastIndexOf(Object o);
List <E> subList(int fromIndex , int toIndex );
}
List <String > words = ...;
words.subList (1, 3). clear ();
int indexOfFoo =
10 + words.subList (10, 15). indexOf("foo");
List <String > list1 = new ArrayList <>();
List <Integer > list2 = new LinkedList <>();
package java.util;
public interface Queue <E>
extends Collection <E> {
boolean add(E e);
boolean offer(E e);
E remove ();
E poll ();
E element ();
E peek ();
}
package java.util;
public interface Deque <E> extends Queue <E> {
void addFirst(E e);
void addLast(E e);
boolean offerFirst(E e);
boolean offerLast(E e);
E removeFirst ();
E removeLast ();
// ...
}
Deque <Object > deque1 = new ArrayDeque <>();
Deque <Integer > deque2 = new LinkedList <>();
deque2.offerLast (1);
deque2.offerLast (2);
deque2.offerLast (3);
Integer element;
while (( element = deque2.pollFirst ()) != null) {
System.out.println(element );
}
package java.util;
public interface Set <E>
extends Collection <E> {
// ...
}
Set <ComplexNumber > numbers = new HashSet <>();
numbers.add(new ComplexNumber (3, 3));
numbers.remove(new ComplexNumber (3, 3));
// equals(), hashCode ()
Set <String > words1 = new HashSet <>();
words1.add (...);
Set <String > words2 = new LinkedHashSet <>();
words2.add (...);
package java.util;
public interface SortedSet <E> extends Set <E> {
SortedSet <E> subSet(
E fromElement , E toElement );
SortedSet <E> headSet(E toElement );
SortedSet <E> tailSet(E fromElement );
E first ();
E last ();
}
SortedSet <String > words = new TreeSet <>();
words.add("aaa");
words.add("bbb");
words.add("ccc");
words.headSet("bbb"). clear ();
List <String > list = new ArrayList <>();
list.add("aaa");
list.add("aaa");
list.add("bbb");
list.add("aaa");
Set <String > set =
new LinkedHashSet <>(list );
List <String > listWithoutDups =
new ArrayList <>(set);
package java.util;
public interface Map <K,V> {
int size ();
boolean isEmpty ();
boolean containsKey(Object key);
boolean containsValue(Object value );
V get(Object key);
V put(K key , V value );
V remove(Object key);
void clear ();
Set <K> keySet ();
Collection <V> values ();
Set <Map.Entry <K, V>> entrySet ();
}
Map <A, B> map = new HashMap <>();
for (A key : map.keySet ()) { ... }
for (B value : map.values ()) { ... }
for (Map.Entry <A, B> entry : map.entrySet ()) {
System.out.printf("%s => %sn",
entry.getKey (), entry.getValue ());
}
map.forEach ((k, v) ->
System.out.printf("%s => %sn", k, v));
Map <String , String > map1 = new HashMap <>();
map1.put("foo", "bar");
map1.put("bar", "baz");
map1.remove("bar");
SortedMap <String , String > map2 = new TreeMap <>();
map2.put("foo", "bar");
map2.put("bar", "baz");
map2.subMap("bar", "foo"). clear ();
Устаревшие классы
java.util.Vector
java.util.Stack
java.util.Dictionary
java.util.Hashtable
Collections.shuffle(list );
Collections.sort(list );
Set <String > set =
Collections.unmodifiableSet(originalSet );
set.remove("abc");
// throws java.lang. UnsupportedOperationException
List <Integer > list = ...;
Object [] array1 = list.toArray ();
Integer [] array2 =
list.toArray(new Integer[list.size ()]);
String [] array = {"A", "B", "C"};
Set <String > set1 =
new HashSet <>(Arrays.asList(array ));
Set <String > set2 = new HashSet <>();
Collections.addAll(set2 , array );
package java.util;
@FunctionalInterface
public interface Comparator <T> {
int compare(T o1 , T o2);
// any number of default or static methods
}
File directory = ...;
File [] javaSourceFiles = directory.listFiles(
new FileFilter () {
@Override
public boolean accept(File file) {
return file.getName (). endsWith(".java");
}
});
package java.io;
@FunctionalInterface
public interface FileFilter {
boolean accept(File pathname );
}
package java.util.function;
@FunctionalInterface
public interface Consumer <T> {
void accept(T t);
}
package java.util.function;
@FunctionalInterface
public interface Supplier <T> {
T get ();
}
package java.util.function;
@FunctionalInterface
public interface Predicate <T> {
boolean test(T t);
}
package java.util.function;
@FunctionalInterface
public interface Function <T, R> {
R apply(T t);
}
package java.util.function;
@FunctionalInterface
public interface BiFunction <T, U, R> {
R apply(T t, U u);
}
package java.util.function;
@FunctionalInterface
public interface UnaryOperator <T>
extends Function <T, T> {
// apply is inherited from Function
}
class IntSquare implements IntUnaryOperator {
@Override
public int applyAsInt(int operand) {
return operand * operand;
}
}
IntUnaryOperator square = x -> {
return x * x;
};
IntConsumer print = x -> System.out.print(x);
IntUnaryOperator cube = x -> x * x * x;
public class Demo {
private int counter;
public void foo() {
IntUnaryOperator square =
x -> x * x;
IntSupplier sequence =
() -> counter ++;
int bonus = 10;
IntUnaryOperator bonusAdder =
(x) -> x + bonus;
}
}
int[] counter = new int[] {0};
IntSupplier sequence = () -> counter [0]++;
ToIntFunction <String > intParser =
Integer :: parseInt;
Consumer <Object > printer =
System.out:: println;
Function <Object , String > objectToString =
Object :: toString;
IntFunction <String []> arrayAllocator =
String []:: new;
IntPredicate isOdd = x -> x % 2 != 0;
IntPredicate isEven = isOdd.negate ();
IntPredicate p1 = ..., p2 = ...;
IntPredicate p3 = p1.and(p2);
Consumer <Object > printer =
System.out:: println;
List <Object > objects = new ArrayList <>();
Consumer <Object > collector = objects ::add;
Consumer <Object > combinedConsumer =
printer.andThen(collector );
DoubleUnaryOperator square = x -> x * x;
DoubleUnaryOperator sin = Math ::sin;
DoubleUnaryOperator complexFunction1 =
sin.andThen(square );
DoubleUnaryOperator complexFunction2 =
sin.compose(square );
Comparator <Double > absoluteValueComparator =
(a, b) -> Double.compare(
Math.abs(a), Math.abs(b));
Comparator <Double > absoluteValueComparator2 =
Comparator.comparing(
Math ::abs , Double :: compare );
package java.util.stream;
public interface Stream <T>
extends BaseStream <T, Stream <T>> {
// MANY methods
}
int sum = IntStream.iterate (1, n -> n + 1)
.filter(n -> n % 5 == 0 && n % 2 != 0)
.limit (10)
.map(n -> n * n)
.sum ();
Set <String > vocabulary = ...;
Stream <String > stream1 = vocabulary.stream ();
BufferedReader reader = ...;
Stream <String > stream2 = reader.lines ();
Path path = ...;
Stream <Path > stream3 = Files.list(path );
Stream <Path > stream4 = Files.walk(path );
IntStream chars = "hello".chars ();
DoubleStream randomNumbers =
DoubleStream.generate(Math :: random );
IntStream integers =
IntStream.iterate (0, n -> n + 1);
IntStream smallIntegers =
IntStream.range(0, 100);
IntStream smallIntegers2 =
IntStream.rangeClosed (0, 100);
IntStream combinedStream =
IntStream.concat(stream1 , stream2 );
IntStream empty = IntStream.empty ();
double [] array = ...;
DoubleStream streamFromArray =
Arrays.stream(array );
IntStream streamOfElements =
IntStream.of(2, 4, 6, 8, 10);
IntStream stream = ...;
stream.filter(n -> n > 100)
.mapToObj(Integer :: toString)
.flatMapToInt(s -> s.chars ())
.distinct ()
.sorted ()
.skip (3)
.limit (2);
IntStream stream1 = ...;
stream1.forEach(System.out:: println );
IntStream stream2 = ...;
OptionalInt result = stream2.findFirst ();
Stream <String > stream3 = ...;
boolean allStringsAreAtLeast10Chars =
stream3.allMatch(s -> s.length () > 10);
Stream <String > stream1 = ...;
Optional <String > minString = stream1.min(
Comparator.comparing(
String ::length , Integer :: compare ));
IntStream stream2 = ...;
int count = stream2.count ();
IntStream stream3 = ...;
int sum = stream3.sum ();
Stream <String > stream1 = ...;
List <String > list =
stream1.collect(Collectors.toList ());
Stream <BigInteger > bigInts = ...;
BigInteger sum = bigInts.reduce(
BigInteger.ZERO , BigInteger ::add);
public static BigInteger factorial(int n) {
return IntStream. rangeClosed (1, n)
.mapToObj(i -> BigInteger.valueOf(i))
.reduce(BigInteger.ONE , BigInteger :: multiply );
}
public static boolean isPalindrome (String s) {
StringBuilder leftToRight = new StringBuilder ();
s.chars (). filter(Character :: isLetterOrDigit )
.map(Character :: toLowerCase )
.forEach(leftToRight :: appendCodePoint );
StringBuilder rightToLeft =
new StringBuilder (leftToRight ). reverse ();
return leftToRight .toString ()
.equals(rightToLeft .toString ());
}

More Related Content

PDF
3. Объекты, классы и пакеты в Java
PDF
5. Ввод-вывод, доступ к файловой системе
PPTX
TDC2016POA | Trilha .NET - C# como você nunca viu: conceitos avançados de pro...
PPTX
Scala - where objects and functions meet
PPTX
TDC2016POA | Trilha .NET - CQRS e ES na prática com RavenDB
PDF
Refactoring to Macros with Clojure
PPTX
Poor Man's Functional Programming
DOC
3. Объекты, классы и пакеты в Java
5. Ввод-вывод, доступ к файловой системе
TDC2016POA | Trilha .NET - C# como você nunca viu: conceitos avançados de pro...
Scala - where objects and functions meet
TDC2016POA | Trilha .NET - CQRS e ES na prática com RavenDB
Refactoring to Macros with Clojure
Poor Man's Functional Programming

What's hot (20)

PPT
Oop lecture9 13
PDF
Python Programming: Data Structure
PDF
Martin Fowler's Refactoring Techniques Quick Reference
PDF
Implementing virtual machines in go & c 2018 redux
PDF
Go ahead, make my day
PPSX
What's New In C# 7
PDF
Programmation fonctionnelle en JavaScript
PPTX
Java весна 2013 лекция 2
PDF
Java 8 Workshop
PDF
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
PDF
PDF
Introducción a Elixir
PPT
Python легко и просто. Красиво решаем повседневные задачи
PDF
Pragmatic functional refactoring with java 8 (1)
PPTX
Pragmatic metaprogramming
PDF
The java language cheat sheet
PPSX
Tuga it 2016 - What's New In C# 6
PDF
Java_practical_handbook
PDF
Javascript
PDF
Haskell 101
Oop lecture9 13
Python Programming: Data Structure
Martin Fowler's Refactoring Techniques Quick Reference
Implementing virtual machines in go & c 2018 redux
Go ahead, make my day
What's New In C# 7
Programmation fonctionnelle en JavaScript
Java весна 2013 лекция 2
Java 8 Workshop
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
Introducción a Elixir
Python легко и просто. Красиво решаем повседневные задачи
Pragmatic functional refactoring with java 8 (1)
Pragmatic metaprogramming
The java language cheat sheet
Tuga it 2016 - What's New In C# 6
Java_practical_handbook
Javascript
Haskell 101
Ad

Viewers also liked (20)

PDF
6.2 Шаблоны функций
PDF
2.4 Использование указателей
PDF
2.8 Строки и ввод-вывод
PDF
Программирование: теоремы и задачи
PDF
3.2 Методы
PDF
Квадратичная математика
PDF
6.1 Шаблоны классов
PDF
3.8 Класс массива
PDF
3.3 Конструкторы и деструкторы
PDF
3.1 Структуры
PDF
3.7 Конструктор копирования и оператор присваивания
PDF
4.4 Таблица виртуальных методов
PDF
6.3 Специализация шаблонов
PDF
3.5 Модификаторы доступа
PDF
5.5 Ключевое слово friend
PDF
4.3 Виртуальные методы
PDF
4.5 Объектно-ориентированное программирование
PDF
4.1 Наследование
PDF
2.5 Ссылки
PDF
2.7 Многомерные массивы
6.2 Шаблоны функций
2.4 Использование указателей
2.8 Строки и ввод-вывод
Программирование: теоремы и задачи
3.2 Методы
Квадратичная математика
6.1 Шаблоны классов
3.8 Класс массива
3.3 Конструкторы и деструкторы
3.1 Структуры
3.7 Конструктор копирования и оператор присваивания
4.4 Таблица виртуальных методов
6.3 Специализация шаблонов
3.5 Модификаторы доступа
5.5 Ключевое слово friend
4.3 Виртуальные методы
4.5 Объектно-ориентированное программирование
4.1 Наследование
2.5 Ссылки
2.7 Многомерные массивы
Ad

Similar to 6. Generics. Collections. Streams (20)

PDF
Collections Framework Beginners Guide 2
PDF
Collections Framework Begineers guide 2
PDF
Google Guava for cleaner code
PPTX
LJ_JAVA_FS_Collection.pptx
PDF
package ADTs public interface CollectionADTltTgt .pdf
PPTX
Module-1 Updated Collection Framework.pptx
PDF
Java cheatsheet
PPTX
Icom4015 lecture14-f16
PPT
collections
PPT
Collections
PDF
Scala in practice
PPT
Collections in Java
PDF
1 The goal is to implement DataStructuresArrayStack accor.pdf
PPTX
Collection and framework
PDF
Java 8 - Nuts and Bold - SFEIR Benelux
PDF
From java to kotlin beyond alt+shift+cmd+k
PPT
Collections
PPTX
22.collections(1)
PDF
using the code below create a method called getCollisionCount that w.pdf
PDF
using the code below write the public V add(K key, V value); that ad.pdf
Collections Framework Beginners Guide 2
Collections Framework Begineers guide 2
Google Guava for cleaner code
LJ_JAVA_FS_Collection.pptx
package ADTs public interface CollectionADTltTgt .pdf
Module-1 Updated Collection Framework.pptx
Java cheatsheet
Icom4015 lecture14-f16
collections
Collections
Scala in practice
Collections in Java
1 The goal is to implement DataStructuresArrayStack accor.pdf
Collection and framework
Java 8 - Nuts and Bold - SFEIR Benelux
From java to kotlin beyond alt+shift+cmd+k
Collections
22.collections(1)
using the code below create a method called getCollisionCount that w.pdf
using the code below write the public V add(K key, V value); that ad.pdf

More from DEVTYPE (20)

PDF
Рукописные лекции по линейной алгебре
PDF
1.4 Точечные оценки и их свойства
PDF
1.3 Описательная статистика
PDF
1.2 Выборка. Выборочное пространство
PDF
Continuity and Uniform Continuity
PDF
Coin Change Problem
PDF
Recurrences
PPT
D-кучи и их применение
PDF
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
PDF
ЖАДНЫЕ АЛГОРИТМЫ
PDF
Скорость роста функций
PDF
Asymptotic Growth of Functions
PDF
Кучи
PDF
Кодирование Хаффмана
PDF
Жадные алгоритмы: введение
PDF
Разбор задач по дискретной вероятности
PDF
Разбор задач модуля "Теория графов ll"
PDF
Наибольший общий делитель
PDF
Числа Фибоначчи
PDF
О-символика
Рукописные лекции по линейной алгебре
1.4 Точечные оценки и их свойства
1.3 Описательная статистика
1.2 Выборка. Выборочное пространство
Continuity and Uniform Continuity
Coin Change Problem
Recurrences
D-кучи и их применение
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
ЖАДНЫЕ АЛГОРИТМЫ
Скорость роста функций
Asymptotic Growth of Functions
Кучи
Кодирование Хаффмана
Жадные алгоритмы: введение
Разбор задач по дискретной вероятности
Разбор задач модуля "Теория графов ll"
Наибольший общий делитель
Числа Фибоначчи
О-символика

Recently uploaded (20)

PDF
System and Network Administration Chapter 2
PPTX
CHAPTER 2 - PM Management and IT Context
PPTX
history of c programming in notes for students .pptx
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PPTX
L1 - Introduction to python Backend.pptx
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PPTX
Introduction to Artificial Intelligence
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PPTX
ai tools demonstartion for schools and inter college
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Transform Your Business with a Software ERP System
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
AI in Product Development-omnex systems
PDF
medical staffing services at VALiNTRY
System and Network Administration Chapter 2
CHAPTER 2 - PM Management and IT Context
history of c programming in notes for students .pptx
Which alternative to Crystal Reports is best for small or large businesses.pdf
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Upgrade and Innovation Strategies for SAP ERP Customers
L1 - Introduction to python Backend.pptx
Design an Analysis of Algorithms I-SECS-1021-03
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
Introduction to Artificial Intelligence
VVF-Customer-Presentation2025-Ver1.9.pptx
How to Choose the Right IT Partner for Your Business in Malaysia
ai tools demonstartion for schools and inter college
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Transform Your Business with a Software ERP System
Adobe Illustrator 28.6 Crack My Vision of Vector Design
AI in Product Development-omnex systems
medical staffing services at VALiNTRY

6. Generics. Collections. Streams

  • 2. public class TreeNode { String value; TreeNode left; TreeNode right; }
  • 3. public static BigDecimal minElement( BigDecimal [] values) { if (values.length == 0) { return null; } BigDecimal min = values [0]; for (int i = 1; i < values.length; i++) { if (min.compareTo(values[i]) > 0) { min = values[i]; } } return min; }
  • 4. TreeNode rootNode = new TreeNode (); rootNode.value = "foobar"; // tree manipulation String value = (String) rootNode.value; Object [] arrayOfBigDecimals = {...}; BigDecimal min = (BigDecimal) minElement(arrayOfBigDecimals );
  • 5. public static <T extends Comparable <T>> T minElement(T[] values) { if (values.length == 0) { return null; } T min = values [0]; for (int i = 1; i < values.length; i++) { if (min.compareTo(values[i]) > 0) { min = values[i]; } } return min; }
  • 6. TreeNode <String > stringNode; TreeNode <Integer > integerNode; TreeNode <int[]> intArrayNode; TreeNode <int > intNode; TreeNode <10> tenNode;
  • 7. package java.util; public final class Optional <T> { private final T value; private Optional(T value) { this.value = Objects. requireNonNull (value ); } public static <T> Optional <T> of(T value) { return new Optional <>( value ); } public T get () { if (value == null) { throw new NoSuchElementException ("No value present"); } return value; } // ... }
  • 8. String text = ???; // is null allowed? @Nullable String nullableText = null; @NonNull String nonNullText = "hello!";
  • 9. String text = "bar"; Optional <String > optionalText = Optional.of("baz");
  • 10. Optional <String > baz = Optional.of("baz"); baz.ifPresent(System.out:: println );
  • 11. Optional <String > bar = Optional.empty (); String value = bar.orElse("bar");
  • 12. package java.util; public final class Optional <T> { private final T value; private Optional(T value) { this.value = Objects. requireNonNull (value ); } public static <T> Optional <T> of(T value) { return new Optional <>( value ); } public T get () { if (value == null) { throw new NoSuchElementException ("No value present"); } return value; } // ... }
  • 13. Optional <String > foo = Optional.empty (); Optional <String > bar = Optional.of("bar"); Optional <String > baz = Optional.ofNullable("baz"); Optional <CharSequence > optionalCharSequence = Optional.<CharSequence >ofNullable("baz"); Optional <String > newOptional = new Optional <>("foobar");
  • 14. package java.util; public final class Optional { private final Object value; private Optional(Object value) { this.value = Objects. requireNonNull (value ); } public static Optional of(Object value) { return new Optional(value ); } public Object get() { if (value == null) { throw new NoSuchElementException ("No value present"); } return value; } // ... }
  • 15. Optional <String > optional = Optional.of("foo"); String value1 = optional.orElse("bar"); String value2 = optional.get ();
  • 16. Optional optional = Optional.of("foo"); String value1 = (String) optional.orElse("bar"); String value2 = (String) optional.get ();
  • 17. T obj = new T(); T[] arr = new T[5]; if (obj instanceof T) {...} T a = (T) b;
  • 18. import java.io.IOException ; public class Hack { public static void main(String [] args) { throwAsUnchecked (new IOException ()); } private static void throwAsUnchecked (Exception e) { Hack.<RuntimeException > genericThrow (e); } private static <T extends Throwable > void genericThrow (Exception e) throws T { throw (T) e; } }
  • 19. Number number = new Integer (1); Number [] numberArray = new Integer [10]; Optional <Integer > optionalInt = Optional.of (1); Optional <Number > optionalNumber = optionalInt; optionalNumber.set(new BigDecimal("3.14"));
  • 20. package java.util; public final class Optional <T> { private final T value; public void ifPresent(Consumer <T> consumer) { if (value != null) consumer.accept(value ); } public T orElseGet(Supplier <T> other) { return value != null ? value : other.get (); } // ... }
  • 21. package java.util; public final class Optional <T> { private final T value; public void ifPresent(Consumer <? super T> consumer) { if (value != null) consumer.accept(value ); } public T orElseGet(Supplier <? extends T> other) { return value != null ? value : other.get (); } // ... }
  • 22. Optional <?> optional = Optional.of (1); Object value1 = optional.get (); Object value2 = optional.orElse (2);
  • 23. int[] oldArray = ...; int oldLength = oldArray.length; int newLength = oldLength + 10; int[] newArray = Arrays.copyOf(oldArray , newLength ); newArray[oldLength] = newElement1; newArray[oldLength + 1] = newElement2; // ...
  • 24. final int[] array = new int[] {1, 2, 3}; array [0] = 10; array [1] = 11; array [2] = 12;
  • 25. package java.util; public interface Collection <E> extends Iterable <E> { int size (); boolean isEmpty (); boolean contains(Object o); boolean add(E e); boolean remove(Object o); void clear (); // ... }
  • 26. Collection <ComplexNumber > c = ...; c.add(new ComplexNumber (1, 2)); boolean contains = c.contains(new ComplexNumber (1, 2));
  • 27. Collection <Integer > collection = ...; Iterator <Integer > it = collection.iterator (); while (it.hasNext ()) { Integer element = it.next (); System.out.println(element ); } for (Integer element : collection) { System.out.println(element ); }
  • 28. Collection <Integer > collection = ...; collection.forEach(System.out:: println );
  • 29. Collection <Integer > collection = ...; for (Integer number : collection) { if (number > 5) { collection.remove(number ); } } // java.util. ConcurrentModificationException
  • 30. package java.util; public interface List <E> extends Collection <E> { E get(int index ); E set(int index , E element ); void add(int index , E element ); E remove(int index ); int indexOf(Object o); int lastIndexOf(Object o); List <E> subList(int fromIndex , int toIndex ); }
  • 31. List <String > words = ...; words.subList (1, 3). clear (); int indexOfFoo = 10 + words.subList (10, 15). indexOf("foo");
  • 32. List <String > list1 = new ArrayList <>(); List <Integer > list2 = new LinkedList <>();
  • 33. package java.util; public interface Queue <E> extends Collection <E> { boolean add(E e); boolean offer(E e); E remove (); E poll (); E element (); E peek (); }
  • 34. package java.util; public interface Deque <E> extends Queue <E> { void addFirst(E e); void addLast(E e); boolean offerFirst(E e); boolean offerLast(E e); E removeFirst (); E removeLast (); // ... }
  • 35. Deque <Object > deque1 = new ArrayDeque <>(); Deque <Integer > deque2 = new LinkedList <>(); deque2.offerLast (1); deque2.offerLast (2); deque2.offerLast (3); Integer element; while (( element = deque2.pollFirst ()) != null) { System.out.println(element ); }
  • 36. package java.util; public interface Set <E> extends Collection <E> { // ... }
  • 37. Set <ComplexNumber > numbers = new HashSet <>(); numbers.add(new ComplexNumber (3, 3)); numbers.remove(new ComplexNumber (3, 3)); // equals(), hashCode ()
  • 38. Set <String > words1 = new HashSet <>(); words1.add (...); Set <String > words2 = new LinkedHashSet <>(); words2.add (...);
  • 39. package java.util; public interface SortedSet <E> extends Set <E> { SortedSet <E> subSet( E fromElement , E toElement ); SortedSet <E> headSet(E toElement ); SortedSet <E> tailSet(E fromElement ); E first (); E last (); }
  • 40. SortedSet <String > words = new TreeSet <>(); words.add("aaa"); words.add("bbb"); words.add("ccc"); words.headSet("bbb"). clear ();
  • 41. List <String > list = new ArrayList <>(); list.add("aaa"); list.add("aaa"); list.add("bbb"); list.add("aaa"); Set <String > set = new LinkedHashSet <>(list ); List <String > listWithoutDups = new ArrayList <>(set);
  • 42. package java.util; public interface Map <K,V> { int size (); boolean isEmpty (); boolean containsKey(Object key); boolean containsValue(Object value ); V get(Object key); V put(K key , V value ); V remove(Object key); void clear (); Set <K> keySet (); Collection <V> values (); Set <Map.Entry <K, V>> entrySet (); }
  • 43. Map <A, B> map = new HashMap <>(); for (A key : map.keySet ()) { ... } for (B value : map.values ()) { ... } for (Map.Entry <A, B> entry : map.entrySet ()) { System.out.printf("%s => %sn", entry.getKey (), entry.getValue ()); } map.forEach ((k, v) -> System.out.printf("%s => %sn", k, v));
  • 44. Map <String , String > map1 = new HashMap <>(); map1.put("foo", "bar"); map1.put("bar", "baz"); map1.remove("bar"); SortedMap <String , String > map2 = new TreeMap <>(); map2.put("foo", "bar"); map2.put("bar", "baz"); map2.subMap("bar", "foo"). clear ();
  • 47. Set <String > set = Collections.unmodifiableSet(originalSet ); set.remove("abc"); // throws java.lang. UnsupportedOperationException
  • 48. List <Integer > list = ...; Object [] array1 = list.toArray (); Integer [] array2 = list.toArray(new Integer[list.size ()]);
  • 49. String [] array = {"A", "B", "C"}; Set <String > set1 = new HashSet <>(Arrays.asList(array )); Set <String > set2 = new HashSet <>(); Collections.addAll(set2 , array );
  • 50. package java.util; @FunctionalInterface public interface Comparator <T> { int compare(T o1 , T o2); // any number of default or static methods }
  • 51. File directory = ...; File [] javaSourceFiles = directory.listFiles( new FileFilter () { @Override public boolean accept(File file) { return file.getName (). endsWith(".java"); } });
  • 52. package java.io; @FunctionalInterface public interface FileFilter { boolean accept(File pathname ); }
  • 57. package java.util.function; @FunctionalInterface public interface BiFunction <T, U, R> { R apply(T t, U u); }
  • 58. package java.util.function; @FunctionalInterface public interface UnaryOperator <T> extends Function <T, T> { // apply is inherited from Function }
  • 59. class IntSquare implements IntUnaryOperator { @Override public int applyAsInt(int operand) { return operand * operand; } }
  • 60. IntUnaryOperator square = x -> { return x * x; }; IntConsumer print = x -> System.out.print(x); IntUnaryOperator cube = x -> x * x * x;
  • 61. public class Demo { private int counter; public void foo() { IntUnaryOperator square = x -> x * x; IntSupplier sequence = () -> counter ++; int bonus = 10; IntUnaryOperator bonusAdder = (x) -> x + bonus; } }
  • 62. int[] counter = new int[] {0}; IntSupplier sequence = () -> counter [0]++;
  • 63. ToIntFunction <String > intParser = Integer :: parseInt; Consumer <Object > printer = System.out:: println; Function <Object , String > objectToString = Object :: toString; IntFunction <String []> arrayAllocator = String []:: new;
  • 64. IntPredicate isOdd = x -> x % 2 != 0; IntPredicate isEven = isOdd.negate (); IntPredicate p1 = ..., p2 = ...; IntPredicate p3 = p1.and(p2);
  • 65. Consumer <Object > printer = System.out:: println; List <Object > objects = new ArrayList <>(); Consumer <Object > collector = objects ::add; Consumer <Object > combinedConsumer = printer.andThen(collector );
  • 66. DoubleUnaryOperator square = x -> x * x; DoubleUnaryOperator sin = Math ::sin; DoubleUnaryOperator complexFunction1 = sin.andThen(square ); DoubleUnaryOperator complexFunction2 = sin.compose(square );
  • 67. Comparator <Double > absoluteValueComparator = (a, b) -> Double.compare( Math.abs(a), Math.abs(b)); Comparator <Double > absoluteValueComparator2 = Comparator.comparing( Math ::abs , Double :: compare );
  • 68. package java.util.stream; public interface Stream <T> extends BaseStream <T, Stream <T>> { // MANY methods }
  • 69. int sum = IntStream.iterate (1, n -> n + 1) .filter(n -> n % 5 == 0 && n % 2 != 0) .limit (10) .map(n -> n * n) .sum ();
  • 70. Set <String > vocabulary = ...; Stream <String > stream1 = vocabulary.stream (); BufferedReader reader = ...; Stream <String > stream2 = reader.lines (); Path path = ...; Stream <Path > stream3 = Files.list(path ); Stream <Path > stream4 = Files.walk(path ); IntStream chars = "hello".chars ();
  • 71. DoubleStream randomNumbers = DoubleStream.generate(Math :: random ); IntStream integers = IntStream.iterate (0, n -> n + 1); IntStream smallIntegers = IntStream.range(0, 100); IntStream smallIntegers2 = IntStream.rangeClosed (0, 100);
  • 72. IntStream combinedStream = IntStream.concat(stream1 , stream2 ); IntStream empty = IntStream.empty (); double [] array = ...; DoubleStream streamFromArray = Arrays.stream(array ); IntStream streamOfElements = IntStream.of(2, 4, 6, 8, 10);
  • 73. IntStream stream = ...; stream.filter(n -> n > 100) .mapToObj(Integer :: toString) .flatMapToInt(s -> s.chars ()) .distinct () .sorted () .skip (3) .limit (2);
  • 74. IntStream stream1 = ...; stream1.forEach(System.out:: println ); IntStream stream2 = ...; OptionalInt result = stream2.findFirst (); Stream <String > stream3 = ...; boolean allStringsAreAtLeast10Chars = stream3.allMatch(s -> s.length () > 10);
  • 75. Stream <String > stream1 = ...; Optional <String > minString = stream1.min( Comparator.comparing( String ::length , Integer :: compare )); IntStream stream2 = ...; int count = stream2.count (); IntStream stream3 = ...; int sum = stream3.sum ();
  • 76. Stream <String > stream1 = ...; List <String > list = stream1.collect(Collectors.toList ()); Stream <BigInteger > bigInts = ...; BigInteger sum = bigInts.reduce( BigInteger.ZERO , BigInteger ::add);
  • 77. public static BigInteger factorial(int n) { return IntStream. rangeClosed (1, n) .mapToObj(i -> BigInteger.valueOf(i)) .reduce(BigInteger.ONE , BigInteger :: multiply ); }
  • 78. public static boolean isPalindrome (String s) { StringBuilder leftToRight = new StringBuilder (); s.chars (). filter(Character :: isLetterOrDigit ) .map(Character :: toLowerCase ) .forEach(leftToRight :: appendCodePoint ); StringBuilder rightToLeft = new StringBuilder (leftToRight ). reverse (); return leftToRight .toString () .equals(rightToLeft .toString ()); }