SlideShare ist ein Scribd-Unternehmen logo
1 von 118
Downloaden Sie, um offline zu lesen
Очень вкусный фрукт 
Guava
Вместо эпиграфа 
Не изобретайте колесо. Если вам нужно сделать нечто, что кажется 
вполне обычным, в библиотеках уже может быть класс, который делает 
это. Вообще говоря, программный код в библиотеке наверняка окажется 
лучше кода, который вы напишете сами, а со временем он может стать 
еще лучше. Мы не ставим под сомнение ваши способности как 
программиста, однако библиотечному коду уделяется гораздо больше 
внимания, чем может позволить себе средний разработчик при 
реализации тех же функций. 
Джошуа Блох. 
Эффективное программирование на Java. 
2 Статья 47 “Изучите библиотеки и пользуйтесь ими”
Философия библиотеки 
● Тщательно разработана 
● Протестирована 
● Оптимизирована 
● Только повсеместно используемые 
функции попадают в библиотеку 
3
Зачем использовать GUAVA 
● Сэкономить значительное количество 
написанного кода 
● Избежать написания кода, который 
трудно отлаживать и в котором легко 
ошибиться 
● Улучшить читабельность 
● Улучшить скорость работы программы. 4
Особенность удаления фич 
● В отличие от JDK удаляют 
нежелательное поведение через 
некоторое время 
● @Beta API 
● @Deprecated non @Beta компоненты 
удаляются через 18 месяцев 
5
Базовые утилиты 
● Работа с null. Optional 
● Preconditions 
● Objects, toString, equals, 
hashCode 
● Компараторы с Ordering 
6
Использование и избежание работы с 
null 
● null - источник множества ошибок. 
● null быстр и нужно научится его правильно 
использовать, где это необходимо, и избегать во 
всех остальных случаях. 
● Многие утилиты GUAVA где недопустимы null’ы 
бросают ошибку. 
7
Optional<T> 
Not null reference of T Present Optional<T> 
null reference of T 
Absent Optional<T> 
8
Optional<T> 
методы создания 
Optional.of(T) 
Optional.absent() 
Optional.fromNullable(T) 
9
Optional<T> 
методы использования 
boolean isPresent() 
T get() 
T or(T) 
T orNull() 
Set<T> asSet() 
10
Optional<T>. пример 
private static Person nullPerson() 
{ 
return null; 
} 
private static Person notNullPerson() 
{ 
return new Person("Egor", "Chernyshev", 24); 
} 
11
Optional<T>. Пример 
... 
private static Person MARIA = new Person("Maria", "Petrova", 26); 
... 
Optional.of(nullPerson());// throws NullPointerExcepton 
Optional.fromNullable(nullPerson()).or(MARIA); // Person{lastName=Petrova, firstName=Maria, age=26} 
Optional.fromNullable(notNullPerson()).or(MARIA); // Person{lastName=Chernyshev, firstName=Egor, age=24} 
Optional.fromNullable(nullPerson()).orNull(); // null 
Optional.fromNullable(notNullPerson()).orNull();// Person{lastName=Chernyshev, firstName=Egor, age=24} 
Optional.fromNullable(nullPerson()).asSet(); // [] 
Optional.fromNullable(notNullPerson()).asSet();// [Person{lastName=Chernyshev, firstName=Egor, age=24}] 
Optional.absent().get();// throws IllegalStateException 
... 
12
Preconditions 
13
Preconditions 
... 
import static com.google.common.base.Preconditions.checkArgument; 
import static com.google.common.base.Preconditions.checkElementIndex; 
import static com.google.common.base.Preconditions.checkNotNull; 
import static com.google.common.base.Preconditions.checkPositionIndex; 
import static com.google.common.base.Preconditions.checkPositionIndexes; 
import static com.google.common.base.Preconditions.checkState; 
... 
14
Preconditions 
int positive = 1; 
checkArgument(positive > 0, "Number %s must be a positive", positive); // IllegalArgumentException: 
//Number 1 must be a negative 
checkArgument(positive < 0, "Number %s must be a negative", positive); // IllegalArgumentException: 
//Number 1 must be a negative 
Object nullValue = null; 
checkNotNull(nullValue, "Value mast be not null"); // NullPointerException: Value mast be not null 
checkState(positive < 0); // IllegalStateException 
checkElementIndex(5, 6); 
checkElementIndex(6, 6); // IndexOutOfBoundsException: index (6) must be less than size (6) 
checkPositionIndex(6, 6); 
checkPositionIndexes(3, 4, 4); 
15
Object Utilities. 
equals, hashCode, toString 
compareTo 
16
public class Person implements Comparable<Person> 
{ 
private String firstName; 
private String lastName; 
private int age; 
public Person(String firstName, String lastName, int age) 
{ 
this.firstName = firstName; 
this.lastName = lastName; 
this.age = age; 
} 
… 
getters and setters 
... 
} 
17
equals() 
... 
@Override 
public boolean equals(Object obj) 
{ 
if (this == obj) return true; 
if (obj == null) return false; 
if (getClass() != obj.getClass()) return false; 
Person other = (Person) obj; 
return Objects.equals(lastName, other.lastName) && 
Objects.equals(firstName, other.firstName) && 
Objects.equals(age, other.age); 
} 
18 ...
hashCode() 
... 
@Override 
public int hashCode() 
{ 
return Objects.hash(lastName, firstName, age); 
} 
... 
19
toString() 
... 
@Override 
public String toString() 
{ 
return MoreObjects.toStringHelper(this) 
.add("lastName", lastName) 
.add("firstName", firstName) 
.add("age", age) 
.toString(); 
} 
... 
20 Person{lastName=Chernyshev, firstName=Egor, age=24}
compareTo() 
... 
@Override 
public int compareTo(Person o) 
{ 
return ComparisonChain.start() 
.compare(lastName, o.lastName) 
.compare(firstName, o.firstName) 
.compare(age, o.age) 
.result(); 
} 
... 
21
Ordering 
утилита для работы с 
упорядоченными объектами 
22
Ordering 
● Ordering<T> - наследник 
Comparator<T> 
● В Ordering реализованы методы 
использующие порядок: min, max, sort и 
т.д. 
23
Ordering<T>. Создание 
● Ordering.natural() - естественный порядок, 
основанный на функции compare(T,T) 
● Ordering.usingToString() - лексикографический 
порядок, строковых представлений (toString) 
● Ordering.from(Comparator) 
● Наследник Ordering 
24
Ordering<T>. Использование 
greatestOf(Iterable iterable, int k) 
See also: leastOf 
isOrdered(Iterable) 
See also: isStricklyOrdered 
sortedCopy(Iterable) 
See also: immutableSortedCopy 
min(E, E) 
See also: max(E, E) 
min(E, E, E, E...) 
See also: max(E, E, E, E...) 
min(Iterable) 
See also: max(Iterable), min(Iterator), max(Iterator) 
25
FirstName Ordering 
private static Ordering<Person> FIRST_NAME_ORDERING = 
Ordering.natural().nullsFirst().onResultOf(new Function<Person, String>() 
{ 
@Override 
public String apply(Person input) 
{ 
return input.getFirstName(); 
} 
}); 
26
Age Ordering 
private static Ordering<Person> AGE_ORDERING = 
Ordering.natural().onResultOf(new Function<Person, Integer>() 
{ 
@Override 
public Integer apply(Person input) 
{ 
return input.getAge(); 
} 
}); 
27
Список Person 
private static List<Person> createPersonList() 
{ 
return Lists.newArrayList( 
new Person("Egor", "Chernyshev", 24), 
new Person("Anton", "Borisov", 36), 
new Person("Elena", "Petrova", 18), 
new Person("Maxim", "Lobanov", 65), 
new Person(null, "Alexandrova", 24)); 
} 
28
Ordering<T>. Примеры 
List<Person> persons = createPersonList(); 
out.println("isOrdered =" + FIRST_NAME_ORDERING.isOrdered(persons)); // isOrdered =false 
Collections.sort(persons, FIRST_NAME_ORDERING); 
out.println(persons);// [Person{lastName=Alexandrova, firstName=null, age=24}, 
// Person{lastName=Borisov, firstName=Anton, age=36}, 
// Person{lastName=Chernyshev, firstName=Egor, age=24}, 
// Person{lastName=Petrova, firstName=Elena, age=18}, 
// Person{lastName=Lobanov, firstName=Maxim, age=65}] 
out.println("isOrdered =" + FIRST_NAME_ORDERING.isOrdered(persons)); // isOrdered =true 
out.println(AGE_ORDERING.max(persons)); // Person{lastName=Lobanov, firstName=Maxim, age=65} 
out.println(AGE_ORDERING.min(persons)); // Person{lastName=Petrova, firstName=Elena, age=18} 
29
Ordering<T>. Примеры 
Ordering<Person> compound = Ordering.compound(Lists.newArrayList(AGE_ORDERING, 
FIRST_NAME_ORDERING)); 
List<Person> compoundSortedPersons = compound.sortedCopy(createPersonList()); 
out.println(compoundSortedPersons); // [Person{lastName=Petrova, firstName=Elena, age=18}, 
// Person{lastName=Alexandrova, firstName=null, age=24}, 
// Person{lastName=Chernyshev, firstName=Egor, age=24}, 
// Person{lastName=Borisov, firstName=Anton, age=36}, 
// Person{lastName=Lobanov, firstName=Maxim, age=65}] 
30
GUAVA Collections 
● ImmutableCollections 
● Новые коллекции в Guava 
● Утилитарные классы Sets, Lists, Maps… 
● Утилиты для расширения java коллекций 
31
Immutable Collections 
32
Чем хороши Immutable objects? 
● Безопасное использование в untrusted 
библиотеках. 
● Потоко безопасны. 
● Хороши для хранения констант, так как 
есть гарантия неизменяемости. 
33
Interface JDK или Guava Immutable version 
Collection JDK ImmutableCollection 
List JDK ImmutableList 
Set JDK ImmutableSet 
SortedSet / 
NavigableSet 
JDK ImmutableSortedSet 
Map JDK ImmutableMap 
SortedMap JDK ImmutableSortedMap 
34 Multiset Guava ImmutableMultiset
Interface JDK или Guava Immutable version 
SortedMultiset Guava ImmutableSortedMultiset 
Multimap Guava ImmutableMultimap 
ListMultimap Guava ImmutableListMultimap 
SetMultimap Guava ImmutableSetMultimap 
BiMap Guava ImmutableSetMultimap 
ClassToInstanceM 
ap 
Guava ImmutableClassToInstanceMap 
35 Table Guava ImmutableTable
ImmutableCollection. Создание 
● ImmutableXXX.of 
● ImmutableXXX.copyOf 
● ImmutableXXX.builder() 
36
ImmutableXXX.of 
ImmutableList<Person> GROUP = ImmutableList.of( 
new Person("Egor", "Chernyshev", 24), 
new Person("Anna", "Tarasova", 30)); 
ImmutableSet<String> ALPHABET = ImmutableSet.of("a", "b", "c"); 
ImmutableMap<String, Integer> CHAR_NUMBERS = ImmutableMap.of("a", 1, "b", 2); 
ImmutableXXX.copyOf 
ImmutableList<Person> COPY_OF_GROUP = ImmutableList.copyOf(GROUP); 
37
ImmutableXXX.builder() 
ImmutableList<Person> GROUP_B = ImmutableList 
.<Person>builder() 
.addAll(GROUP) 
.add(new Person("Anton", "Belov", 41)) 
.build(); 
38
copyOf умнее, чем вы думаете 
● copyOf пытается избежать полного 
копирования объектов. 
● В общем случае ImmutableXXX.copyOf 
(ImmutableXXX) пытается выполнится 
за O(1), за исключением некоторых 
случаев 
39
исключения 
● ImmutableSet.copyOf(ImmutableList) 
● ImmutableList<String> hugeList; 
ImmutableList.copyOf(hugeList.subList(0, 
10)) 
● ImmutableSet.copyOf 
(myImmutableSortedSet) 
40
Multiset 
41
Multiset 
Мультимножество: 
{a, a, b, c, f, d} 
Эквивалентность: 
{a, a, b} = {a, b, a} 
42
Multiset. Пример 
Подсчет количества каждого символа в тексте: 
Multiset<Character> toCharsMultiset(String text) 
{ 
return HashMultiset.create(Chars.asList(text.toCharArray())); 
} 
43
Multiset. Реализации 
Map Соответствующий Multiset Допускает null? 
HashMap HashMultiset Да 
TreeMap TreeMultiset Да (если компаратор 
поддерживает) 
LinkedHashMap LinkedHashMultiset Да 
ConcurrentHashMap ConcurrentHashMultiset Нет 
ImmutableMap ImmutableMultiset Нет 
44
Multimap 
45
Multimap 
Map<K, List<V>> 
Map<K, Set<V>> Multimap<K, V> 
a->1, a->2, a->4, b->3, c->5 
или 
a->[1, 2, 4], b->3, c->5 
46
Multimap<K,V>. Представления 
Multimap<K,V>.asMap() Map<K, Collection<V>> 
Multimap<K,V>.entries() Collection<Entry<K,V>> 
Multimap<K,V>.keySet() Set<K> 
Multimap<K,V>.keys() Multiset<K> 
Multimap<K,V>.values() Collection<V> 
47
Multimap<K,V>. Реализации 
Реализация Ключи ведут себя как... Значения ведут себя как... 
ArrayListMultimap HashMap ArrayList 
HashMultiMap HasMap HashSet 
LinkedListMultimap LinkedHashMap LinkedList 
LinkedHashMultiMap LinkedHashMap LinkedHashSet 
TreeMultimap TreeMap TreeSet 
ImmutableListMultimap ImmutableMap ImmutableList 
ImmutableSetMultimap ImmutableMap ImmutableSet 
48
Multimap. Пример 
private static Function<Person, String> FIRST_NAME_EXTRACTOR = new 
Function<Person, String>() 
{ 
@Override 
public String apply(Person input) 
{ 
return input.getFirstName(); 
} 
}; 
49
Multimap. Пример 
List<Person> PERSONS = Lists.newArrayList( 
new Person("Egor", "Chernyshev", 24), 
new Person("Anton", "Borisov", 36), 
new Person("Elena", "Petrova", 18), 
new Person("Elena", "Birkova", 11), 
new Person("Maxim", "Lobanov", 65)); 
Multimap<String, Person> index = Multimaps.index(PERSONS, FIRST_NAME_EXTRACTOR); 
50
BiMap 
51
BiMap<K,V> 
BiMap<V, K> - это Map<K, V>, в которой 
● Добавлен метод BiMap<V, K> inverse(). 
● Есть проверка на уникальность значений. 
● values() возвращает Set<V>. 
52
BiMap<K,V>. Реализации 
Key-Value Map Value-Key Map Реализация 
HashMap HashMap HashBiMap 
ImmutableMap ImmutableMap ImmutableBiMap 
EnumMap EnumMap EnumBiMap 
EnumMap HashMap EnumHashBiMap 
53
Table 
54
Table<R, C, V> 
● Table - это способ хранения индекса 
объекта по двум ключам R и C. 
● Table<R,C,V> заменяет неуклюжую 
реализацию структуры 
Map<R, Map<C, V>> 
55
Table<R, C, V>. Представления 
Table<R,C,V>.rowMap() Map<R, Map<C,V>> 
Table<R,C,V>.rowKeySet() Set<R> 
Table<R,C,V>.row(r) Map<C,V> 
columnMap(), 
columnKeySet(), column(c) 
Аналогично, row. Column access по 
производительности работает медленнее, чем row 
access из за структуры данных. 
Table<R,C,V>.cellSet() Set<Table.Cell<R,C,V>> 
56
Table<R, C, V>. Реализации 
Реализация На основе структуры 
HashBasedTable HashMap<R, HashMap<C, V>> 
TreeBasedTable TreeMap<R, TreeMap<C, V>> 
ImmutableTable ImmutableMap<R, ImmutableMap<C, V>> 
ArrayTable Двумерный массив. Хорошо подходит для 
задач, с сильно заполненными таблицами. 
57
ClassToInstanceMap 
58
ClassToInstanceMap<B> 
● Реализация Map<Class<? extends B>, B> 
● Поддерживает примитивы 
Реализации: 
● ImmutableClassToInstanceMap 
● MutableClassToInstanceMap 
59
public interface MegaService {} 
public class SuperMegaService implements MegaService{} 
public class SuperMegaBupperService implements MegaService{} 
… 
private static final ClassToInstanceMap<MegaService> REGISTRY = MutableClassToInstanceMap.create(); 
… 
REGISTRY.putInstance(SuperMegaService.class, new SuperMegaService());// OK 
REGISTRY.putInstance(SuperMegaBupperService.class, new SuperMegaBupperService());// OK 
REGISTRY.putInstance(MegaService.class, new SuperMegaBupperService());// OK 
REGISTRY.putInstance(SuperMegaService.class, new SuperMegaBupperService()); // Ошибка компиляции 
REGISTRY.putInstance(String.class, "qqqq"); // Ошибка компиляции 
REGISTRY.put(String.class, "qqqq"); // Ошибка компиляции 
REGISTRY.getInstance(MegaService.class);// OK 
REGISTRY.getInstance(String.class);// Ошибка компиляции 
60
RangeSet 
61
RangeSet<C extends Comparable> 
● JDK 1.6 + 
● Не поддерживается в GWT 
RangeSet<Integer> rangeSet = TreeRangeSet.create(); 
rangeSet.add(Range.closed(1, 10)); // {[1, 10]} 
rangeSet.add(Range.closedOpen(11, 15)); // disconnected range: {[1, 10], [11, 15)} 
rangeSet.add(Range.closedOpen(15, 20)); // connected range; {[1, 10], [11, 20)} 
rangeSet.add(Range.openClosed(0, 0)); // empty range; {[1, 10], [11, 20)} 
rangeSet.remove(Range.open(5, 10)); // splits [1, 10]; {[1, 5], [10, 10], [11, 20)} 
62
RangeSet<C>. Представления 
RangeSet<C>.subRangeSet(Range<C>) RangeSet<C> 
RangeSet<C>.asRanges() Set<Range<C>> 
RangeSet<C>.asSet(DiscreteDomain<C>) 
только ImmutableRangeSet 
ImmutableSortedSet<C> 
63
RangeSet<C>. Запросы 
Метод Возвращаемое значение 
RangeSet<C>.contains(C) boolean 
RangeSet<C>.rangeContaining(C) Range<C> 
RangeSet<C>.encloses(Range<C>) boolean 
RangeSet<C>.span() Range<C> 
64
RangeMap 
65
Collections Utils 
Коллекция JDK или Guava Класс с утилитами 
Collection JDK Collections2 
List JDK Lists 
Set JDK Sets 
SortedSet JDK Sets 
Map JDK Maps 
SortedMap JDK Maps 
66 Queue JDK Queues
Collections Utils 
Коллекция JDK или Guava Класс с утилитами 
Multiset Guava Multisets 
Multimap Guava Multimaps 
BiMap Guava Maps 
Table Guava Tables 
67
Static constructors 
List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<TypeThatsTooLongForItsOwnGood>(); 
------------------------------------------------------------------------------------------ 
List<TypeThatsTooLongForItsOwnGood> list1 = Lists.newArrayList(); 
Map<KeyType, LongishValueType> map = Maps.newLinkedHashMap(); 
------------------------------------------------------------------------------------------ 
List<TypeThatsTooLongForItsOwnGood> list2 = new ArrayList<>(); 
------------------------------------------------------------------------------------------ 
Set<Type> copySet = Sets.newHashSet(elements); 
List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma"); 
------------------------------------------------------------------------------------------ 
List<Type> exactly100 = Lists.newArrayListWithCapacity(100); 
List<Type> approx100 = Lists.newArrayListWithExpectedSize(100); 
Set<Type> approx100Set = Sets.newHashSetWithExpectedSize(100); 
------------------------------------------------------------------------------------------ 
Multiset<String> multiset = HashMultiset.create(); 
68
Iterables 
● Guava предпочитает Iterable вместо 
Collection 
● Многие Iterable являются Lazy 
● Утилита FluentItrable, оборачивает 
Iterable и предоставляет набор 
методов для работы в функцинальном 
стиле. 69
Lists 
Метод Описание 
partiton(List, int) List<List> - разбиение списка на подсписки 
определенной длины. 
reverse(List) Развернутое представление списка 
70
Sets 
Метод Описание 
union(Set, Set) Объединение множеств 
intersection(Set, Set) Пересечение 
difference(Set, Set) Разность 
symmetricDifference(Set, Set) симметричная разность 
powerSet(Set) Множество всех подмножеств 
71
Maps 
72
Maps.uniqueIndex() 
Maps.uniqueIndex(Lists.newArrayList("dddd", "ddddd", "qwcccccde"), new Function<String, Integer>() 
{ 
@Override 
public Integer apply(String input) 
{ 
return input.length(); 
} 
}); 
//{4=dddd, 5=ddddd, 9=qwcccccde} 
● Выбросится ошибка, если Function 
73 вернет неуникальное значение
MapDifference d = Maps.difference() 
entriesOnlyOnLeft() entriesInCommon() entriesOnlyOnRight() 
entriesDiffering() 
74
Multimaps 
Метод Описание 
index(Iterable, Function) Построение индекса коллекции по ключевой 
функции 
invertFrom(Multimap, Multimap) Разворот Map’ы (<K,V> -> <V,K>) 
forMap(Map) Преобразвание Map<K,V> в Multimap<K,V> 
75
Tables 
Метод Описание 
transpose(Table<R,C,V>) Транспонирование таблицы Table<R,C,V> -> 
Table<C,R,V> 
76
Extention utilities 
● Forwarding Decorators 
● PeekingIterator 
● AbstractIterator 
77
Forwarding Decorators. Пример 
class AddLoggingList<E> extends ForwardingList<E> { 
final List<E> delegate; // backing list 
@Override protected List<E> delegate() { 
return delegate; 
} 
@Override public void add(int index, E elem) { 
log(index, elem); 
super.add(index, elem); 
} 
@Override public boolean add(E elem) { 
return standardAdd(elem); // implements in terms of add(int, E) 
} 
@Override public boolean addAll(Collection<? extends E> c) { 
return standardAddAll(c); // implements in terms of add 
} 
} 
78
Forwarding Decorators 
Interface Forwarding decorator 
Collection ForwardingCollection 
List ForwardingList 
Set ForwardingSet 
SortedSet ForwardingSortedSet 
Map ForwardingMap 
SortedMap ForwardingSortedMap 
ConcurrentMap ForwardingConcurrentMap 
79 Map.Entry ForwardingMapEntry
Forwarding Decorators 
Interface Forwarding decorator 
Queue ForwardingQueue 
Iterator ForwardingIterator 
ListIterator ForwardingListIterator 
Multiset ForwardingSortedSet 
Multimap ForwardingMultiset 
ListMultiMap ForwardingListMultiMap 
SetMultimap ForwardingSetMultimap 
80
PeekingIterator 
List<String> result = Lists.newArrayList(); 
PeekingIterator<String> iter = Iterators.peekingIterator(source.iterator()); 
while (iter.hasNext()) { 
String current = iter.next(); 
while (iter.hasNext() && iter.peek().equals(current)) { 
// skip this duplicate element 
iter.next(); 
} 
result.add(current); 
} 
81
AbstractIterator 
public static Iterator<String> skipNulls(final Iterator<String> in) { 
return new AbstractIterator<String>() { 
protected String computeNext() { 
while (in.hasNext()) { 
String s = in.next(); 
if (s != null) { 
return s; 
} 
} 
return endOfData(); 
} 
}; 
} 
82
Caches 
Кэширование информации в памяти. 
Применимость, создание кэшей, 
использование примеры. 
83
Cache. Применимость 
● Память -> Скорость 
● Элемент используется больше 1 раза 
● Все кэшируемые значения помещаются в 
оперативной памяти 
84
Cache. Создание 
Cache<String, Person> cache = CacheBuilder 
.newBuilder() 
.expireAfterAccess(5, TimeUnit.MINUTES) 
.maximumSize(10000) 
.build(); 
85
Cache. Добавление значения 
CacheLoader 
/** 
* Медленная операция получения человека по Web сервису 
* из внешней системы 
*/ 
private Person loadPersonByWebService(String key) 
{ 
return new Person("Anton", "Borisow", 88); 
} 
86
Cache. Добавление значения 
CacheLoader 
Cache<String, Person> cache = CacheBuilder 
.newBuilder() 
.expireAfterAccess(5, TimeUnit.MINUTES) 
.maximumSize(10000) 
.build(new CacheLoader<String, Person>() 
{ 
@Override 
public Person load(String key) throws Exception 
{ 
return loadPersonByWebService(key); 
} 
}); 
87
Cache. Добавление значения 
from Callable 
try{ 
cache.get(key, new Callable<Person>(){ 
@Override 
public Person call() throws Exception 
{ 
return loadPersonByWebService(key); 
} 
}); 
} 
catch (ExecutionException e) 
{ 
throw new RuntimeException(e.getMessage(), e); 
88 }
Cache. Добавление значения 
directly insert 
cache.put(key, loadPersonByWebService(key)); 
89
Cache. Eviction 
● Size-base eviction 
● Timed eviction 
● Reference-based eviction 
● Explicit eviction 
● Removal Listener 
90
Cache. Size-based eviction 
● CacheBulder.maximumSize(long) 
● CacheBuilder.maximumWeight(long) 
● CacheBuilder.weighter(Weighter<K,V>) 
91
Cache. Timed eviction 
● CacheBuilder.expireAfterWrite(long, TimeUnit) 
● CacheBuilder.expireAfterAccess(long, TimeUnit) 
92
Cache. Reference-based eviction 
● CacheBulder.weakKeys() 
● CacheBuilder.weakValues() 
● CacheBuilder.softValues() 
93
Cache. Explicit removals 
● Cache.invalidate(key) 
● Cache.invalidateAll(keys) 
● Cache.invalidateAll() 
94
Cache. Когда происходит eviction 
● В момент записи нового значения 
● Иногда (если записей в кэш мало) при 
получении значения по ключу 
● Кэш не обслуживается отдельным 
95 потоком!
Cache. Прочие возможности 
● Statistic: 
Включение: CacheBuilder.recordStats(); 
Получение: CacheStats stats = Cache.stats(); 
Использование: 
● stats.hitRate() - количество попаданий 
● stats.averageLoadPenalty() - среднее время на загрузку 
новых значений 
● stats.evictionCount() - количество eviction’ов 
● asMap 
96
Мощные, простые инструменты 
для написания корректного 
многопоточного кода 
ListenableFutures, Service, Striped 
97
ListenableFuture 
● Расширяет Future - позволяет 
регистрировать Callback на момент 
выполнения операции. 
● Callback будет вызван один раз. 
● Callback обрабатывает ошибки с 
помщью onFaiture() метода. 
98
DocumentLoaderService 
private ListeningExecutorService executorService = MoreExecutors 
.listeningDecorator(Executors.newFixedThreadPool(5)); 
… 
public void loadDocument(final String docUrl, FutureCallback<String> callback){ 
ListenableFuture<String> future = executorService.submit(new Callable<String>(){ 
@Override 
public String call() throws Exception{ 
return IOUtils.toString(docUrl, StandardCharsets.UTF_8.name()); 
} 
}); 
Futures.addCallback(future, callback); 
} 
9 9 …
DocumentLoaderService. Использование 
DocumentLoaderService service = DocumentLoaderService.instance(); 
for (String url : TESTED_URLS) 
{ 
service.loadDocument(url, new FutureCallback<String>(){ 
@Override 
public void onSuccess(String result){ 
handleDocument(result); 
} 
@Override 
public void onFailure(Throwable t){ 
handleError(t); 
} 
}); 
} 
100
Service 
101
Service 
● Интерфейс Service - это объект с рабочим 
состоянием и методами остановки и запуска. 
● Service имеет ряд предопределенных 
состояний. 
● Существуют базовые абстрактные 
реализации, которые необходимо 
переопределять для написания собственных 
102 служб и сервисов.
Использование Service 
NEW STARTING RUNNING STOPPING TERMINATED 
Метод Описание 
startAsync() Запуск 
stopAsync() Остановка 
state() Статус 
103
Serivce. Базовые реализации 
● AbstractIdleService 
● AbstractExecutionThreadService 
● AbstractScheduledService 
● AbstractService 
104
ServiceManger 
Метод Описание 
startAsync() Стартует все службы 
stopAsync() Останавливает все службы 
addListener Добавление листенеров на смены статусов 
awaitHealthy() дождаться пока все службы не станут RUNNING 
awaitStopped() дождаться пока все службы не будут остановлены 
isHealthy() true, если все службы RUNNING 
servicesByState() ultimap сервисов сгрупированных по состояниям 
105 startupTimes() Map сервисов с временами старта. Отсортированная
Striped 
106
Striped. Пример 
private Lock lock = new ReentrantLock(); 
public void runAction(String key) 
{ 
lock.lock(); 
try 
{ 
threadSafeActionWithResource(getResource(key)); 
} 
finally 
{ 
lock.unlock(); 
} 
} 
107
Striped. Пример 
private Striped<Lock> striped = Striped.lazyWeakLock(2); 
public void runAction(String key) 
{ 
Lock lock = striped.get(key); 
lock.lock(); 
try 
{ 
threadSafeActionWithResource(getResource(key)); 
} 
finally 
{ 
lock.unlock(); 
} 
} 
108
Прочие утилиты 
Strings, Joiner, Splitter, CharMatcher 
и пр. 
109
Strings 
Метод Описание 
isNullOrEmpty(str) true,если str == null или str.length() == 0 
nullToEmpty(str) Преобразуется null в “” 
emptyToNull(str) Преобразует “” в null 
repeat(str, int) Повторяет str строку int раз 
110
Joiner 
Joiner joiner = Joiner.on(", ").useForNull("null"); 
List<String> parts = Lists.newArrayList("alpha", "beta", "gamma"); 
parts.add(null); 
String joined = joiner.join(parts); 
// alpha, beta, gamma, null 
111
Splitter 
Iterable<String> splited = Splitter 
.on(",") 
.omitEmptyStrings() 
.split("aa,,ddd,,bb,b,bbbb,ffd"); 
//[aa, ddd, bb, b, bbbb, ffd] 
112
CharMatcher 
113
Primitives 
Примитивный тип Утилиты 
byte Bytes, SignedBytes, UnsignedBytes 
short Shorts 
int Ints, UnsignedInteger, UnsignedInts 
long Longs, UnsignedLong, UnsignedLongs 
float Floats 
double Doubles 
char Chars 
114 boolean Booleans
Ranges 
115
Math 
IntMath, LongMath, BigIntegerMath 
116
Hashing 
● md5 
● sha256 
● sha1 
● sha512 
● murmur2_128 
● murmur3_32 
117
Вопросы? 
Егор Чернышев 
email: egrik1990@gmail.com 
Skype: egrik1990

Weitere ähnliche Inhalte

Was ist angesagt?

Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Hitesh-Java
 
Nanowire battery
Nanowire batteryNanowire battery
Nanowire batteryrounak077
 
Defending against Java Deserialization Vulnerabilities
 Defending against Java Deserialization Vulnerabilities Defending against Java Deserialization Vulnerabilities
Defending against Java Deserialization VulnerabilitiesLuca Carettoni
 
What Is Spring Framework In Java | Spring Framework Tutorial For Beginners Wi...
What Is Spring Framework In Java | Spring Framework Tutorial For Beginners Wi...What Is Spring Framework In Java | Spring Framework Tutorial For Beginners Wi...
What Is Spring Framework In Java | Spring Framework Tutorial For Beginners Wi...Edureka!
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKJosé Paumard
 
PyCon Korea 2019 REST API Document Generation
PyCon Korea 2019 REST API Document GenerationPyCon Korea 2019 REST API Document Generation
PyCon Korea 2019 REST API Document Generation용선 이
 
Pentesting GraphQL Applications
Pentesting GraphQL ApplicationsPentesting GraphQL Applications
Pentesting GraphQL ApplicationsNeelu Tripathy
 
Hands-On Java web passando por Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...
Hands-On Java web passando por  Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...Hands-On Java web passando por  Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...
Hands-On Java web passando por Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...Mario Jorge Pereira
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
Understanding Sling Models in AEM
Understanding Sling Models in AEMUnderstanding Sling Models in AEM
Understanding Sling Models in AEMAccunity Software
 
Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016
Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016
Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016Christian Schneider
 
Spring boot Under Da Hood
Spring boot Under Da HoodSpring boot Under Da Hood
Spring boot Under Da HoodMichel Schudel
 
Exploiting Deserialization Vulnerabilities in Java
Exploiting Deserialization Vulnerabilities in JavaExploiting Deserialization Vulnerabilities in Java
Exploiting Deserialization Vulnerabilities in JavaCODE WHITE GmbH
 

Was ist angesagt? (20)

Optional in Java 8
Optional in Java 8Optional in Java 8
Optional in Java 8
 
Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans
 
Nanowire battery
Nanowire batteryNanowire battery
Nanowire battery
 
Xke spring boot
Xke spring bootXke spring boot
Xke spring boot
 
Defending against Java Deserialization Vulnerabilities
 Defending against Java Deserialization Vulnerabilities Defending against Java Deserialization Vulnerabilities
Defending against Java Deserialization Vulnerabilities
 
What Is Spring Framework In Java | Spring Framework Tutorial For Beginners Wi...
What Is Spring Framework In Java | Spring Framework Tutorial For Beginners Wi...What Is Spring Framework In Java | Spring Framework Tutorial For Beginners Wi...
What Is Spring Framework In Java | Spring Framework Tutorial For Beginners Wi...
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UK
 
PyCon Korea 2019 REST API Document Generation
PyCon Korea 2019 REST API Document GenerationPyCon Korea 2019 REST API Document Generation
PyCon Korea 2019 REST API Document Generation
 
Mock your way with Mockito
Mock your way with MockitoMock your way with Mockito
Mock your way with Mockito
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Pentesting GraphQL Applications
Pentesting GraphQL ApplicationsPentesting GraphQL Applications
Pentesting GraphQL Applications
 
Hands-On Java web passando por Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...
Hands-On Java web passando por  Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...Hands-On Java web passando por  Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...
Hands-On Java web passando por Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
Understanding Sling Models in AEM
Understanding Sling Models in AEMUnderstanding Sling Models in AEM
Understanding Sling Models in AEM
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016
Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016
Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016
 
Java 17
Java 17Java 17
Java 17
 
Spring boot Under Da Hood
Spring boot Under Da HoodSpring boot Under Da Hood
Spring boot Under Da Hood
 
Exploiting Deserialization Vulnerabilities in Java
Exploiting Deserialization Vulnerabilities in JavaExploiting Deserialization Vulnerabilities in Java
Exploiting Deserialization Vulnerabilities in Java
 

Andere mochten auch

Maven 3 : уличная магия
Maven 3 : уличная магияMaven 3 : уличная магия
Maven 3 : уличная магияAleksey Solntsev
 
Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Frameworkbeloslab
 
Spring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny BorisovSpring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny BorisovJavaDayUA
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSFRoman Brovko
 
HighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsHighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsAlexey Kharlamov
 
Async Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляAsync Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляVitebsk Miniq
 
Phoenix for Rubyists
Phoenix for RubyistsPhoenix for Rubyists
Phoenix for RubyistsMike North
 
Hazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSHazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSuzquiano
 
50 nouvelles choses que l'on peut faire en Java 8
50 nouvelles choses que l'on peut faire en Java 850 nouvelles choses que l'on peut faire en Java 8
50 nouvelles choses que l'on peut faire en Java 8José Paumard
 
Алексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsАлексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsNata_Churda
 
Amazon cloud – готовим вместе
Amazon cloud – готовим вместеAmazon cloud – готовим вместе
Amazon cloud – готовим вместеVitebsk Miniq
 
Hazelcast for Terracotta Users
Hazelcast for Terracotta UsersHazelcast for Terracotta Users
Hazelcast for Terracotta UsersHazelcast
 
50 new things we can do with Java 8
50 new things we can do with Java 850 new things we can do with Java 8
50 new things we can do with Java 8José Paumard
 
JFokus 50 new things with java 8
JFokus 50 new things with java 8JFokus 50 new things with java 8
JFokus 50 new things with java 8José Paumard
 
Gamification in outsourcing company: experience report.
Gamification in outsourcing company: experience report.Gamification in outsourcing company: experience report.
Gamification in outsourcing company: experience report.Mikalai Alimenkou
 
Java 8, the Good, the Bad and the Ugly
Java 8, the Good, the Bad and the UglyJava 8, the Good, the Bad and the Ugly
Java 8, the Good, the Bad and the UglyMikalai Alimenkou
 

Andere mochten auch (20)

Google Guava
Google GuavaGoogle Guava
Google Guava
 
Maven 3 : уличная магия
Maven 3 : уличная магияMaven 3 : уличная магия
Maven 3 : уличная магия
 
Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Framework
 
Spring in java
Spring in javaSpring in java
Spring in java
 
Spring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny BorisovSpring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny Borisov
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSF
 
HighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsHighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data Grids
 
Async Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляAsync Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуля
 
Phoenix for Rubyists
Phoenix for RubyistsPhoenix for Rubyists
Phoenix for Rubyists
 
Hazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSHazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMS
 
50 nouvelles choses que l'on peut faire en Java 8
50 nouvelles choses que l'on peut faire en Java 850 nouvelles choses que l'on peut faire en Java 8
50 nouvelles choses que l'on peut faire en Java 8
 
Алексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsАлексей Николаенков, Devexperts
Алексей Николаенков, Devexperts
 
Code review at large scale
Code review at large scaleCode review at large scale
Code review at large scale
 
Amazon cloud – готовим вместе
Amazon cloud – готовим вместеAmazon cloud – готовим вместе
Amazon cloud – готовим вместе
 
Hazelcast for Terracotta Users
Hazelcast for Terracotta UsersHazelcast for Terracotta Users
Hazelcast for Terracotta Users
 
ЖК Зорге 9
ЖК Зорге 9ЖК Зорге 9
ЖК Зорге 9
 
50 new things we can do with Java 8
50 new things we can do with Java 850 new things we can do with Java 8
50 new things we can do with Java 8
 
JFokus 50 new things with java 8
JFokus 50 new things with java 8JFokus 50 new things with java 8
JFokus 50 new things with java 8
 
Gamification in outsourcing company: experience report.
Gamification in outsourcing company: experience report.Gamification in outsourcing company: experience report.
Gamification in outsourcing company: experience report.
 
Java 8, the Good, the Bad and the Ugly
Java 8, the Good, the Bad and the UglyJava 8, the Good, the Bad and the Ugly
Java 8, the Good, the Bad and the Ugly
 

Ähnlich wie Очень вкусный фрукт Guava

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysischashnikov
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Ontico
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Stfalcon Meetups
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8chashnikov
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9Technopark
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Evgeny Borisov
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклыSergey Nemchinsky
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 

Ähnlich wie Очень вкусный фрукт Guava (20)

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
 
Bytecode
BytecodeBytecode
Bytecode
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
course js day 2
course js day 2course js day 2
course js day 2
 
Kotlin
KotlinKotlin
Kotlin
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 

Очень вкусный фрукт Guava

  • 2. Вместо эпиграфа Не изобретайте колесо. Если вам нужно сделать нечто, что кажется вполне обычным, в библиотеках уже может быть класс, который делает это. Вообще говоря, программный код в библиотеке наверняка окажется лучше кода, который вы напишете сами, а со временем он может стать еще лучше. Мы не ставим под сомнение ваши способности как программиста, однако библиотечному коду уделяется гораздо больше внимания, чем может позволить себе средний разработчик при реализации тех же функций. Джошуа Блох. Эффективное программирование на Java. 2 Статья 47 “Изучите библиотеки и пользуйтесь ими”
  • 3. Философия библиотеки ● Тщательно разработана ● Протестирована ● Оптимизирована ● Только повсеместно используемые функции попадают в библиотеку 3
  • 4. Зачем использовать GUAVA ● Сэкономить значительное количество написанного кода ● Избежать написания кода, который трудно отлаживать и в котором легко ошибиться ● Улучшить читабельность ● Улучшить скорость работы программы. 4
  • 5. Особенность удаления фич ● В отличие от JDK удаляют нежелательное поведение через некоторое время ● @Beta API ● @Deprecated non @Beta компоненты удаляются через 18 месяцев 5
  • 6. Базовые утилиты ● Работа с null. Optional ● Preconditions ● Objects, toString, equals, hashCode ● Компараторы с Ordering 6
  • 7. Использование и избежание работы с null ● null - источник множества ошибок. ● null быстр и нужно научится его правильно использовать, где это необходимо, и избегать во всех остальных случаях. ● Многие утилиты GUAVA где недопустимы null’ы бросают ошибку. 7
  • 8. Optional<T> Not null reference of T Present Optional<T> null reference of T Absent Optional<T> 8
  • 9. Optional<T> методы создания Optional.of(T) Optional.absent() Optional.fromNullable(T) 9
  • 10. Optional<T> методы использования boolean isPresent() T get() T or(T) T orNull() Set<T> asSet() 10
  • 11. Optional<T>. пример private static Person nullPerson() { return null; } private static Person notNullPerson() { return new Person("Egor", "Chernyshev", 24); } 11
  • 12. Optional<T>. Пример ... private static Person MARIA = new Person("Maria", "Petrova", 26); ... Optional.of(nullPerson());// throws NullPointerExcepton Optional.fromNullable(nullPerson()).or(MARIA); // Person{lastName=Petrova, firstName=Maria, age=26} Optional.fromNullable(notNullPerson()).or(MARIA); // Person{lastName=Chernyshev, firstName=Egor, age=24} Optional.fromNullable(nullPerson()).orNull(); // null Optional.fromNullable(notNullPerson()).orNull();// Person{lastName=Chernyshev, firstName=Egor, age=24} Optional.fromNullable(nullPerson()).asSet(); // [] Optional.fromNullable(notNullPerson()).asSet();// [Person{lastName=Chernyshev, firstName=Egor, age=24}] Optional.absent().get();// throws IllegalStateException ... 12
  • 14. Preconditions ... import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkElementIndex; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkPositionIndex; import static com.google.common.base.Preconditions.checkPositionIndexes; import static com.google.common.base.Preconditions.checkState; ... 14
  • 15. Preconditions int positive = 1; checkArgument(positive > 0, "Number %s must be a positive", positive); // IllegalArgumentException: //Number 1 must be a negative checkArgument(positive < 0, "Number %s must be a negative", positive); // IllegalArgumentException: //Number 1 must be a negative Object nullValue = null; checkNotNull(nullValue, "Value mast be not null"); // NullPointerException: Value mast be not null checkState(positive < 0); // IllegalStateException checkElementIndex(5, 6); checkElementIndex(6, 6); // IndexOutOfBoundsException: index (6) must be less than size (6) checkPositionIndex(6, 6); checkPositionIndexes(3, 4, 4); 15
  • 16. Object Utilities. equals, hashCode, toString compareTo 16
  • 17. public class Person implements Comparable<Person> { private String firstName; private String lastName; private int age; public Person(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } … getters and setters ... } 17
  • 18. equals() ... @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; return Objects.equals(lastName, other.lastName) && Objects.equals(firstName, other.firstName) && Objects.equals(age, other.age); } 18 ...
  • 19. hashCode() ... @Override public int hashCode() { return Objects.hash(lastName, firstName, age); } ... 19
  • 20. toString() ... @Override public String toString() { return MoreObjects.toStringHelper(this) .add("lastName", lastName) .add("firstName", firstName) .add("age", age) .toString(); } ... 20 Person{lastName=Chernyshev, firstName=Egor, age=24}
  • 21. compareTo() ... @Override public int compareTo(Person o) { return ComparisonChain.start() .compare(lastName, o.lastName) .compare(firstName, o.firstName) .compare(age, o.age) .result(); } ... 21
  • 22. Ordering утилита для работы с упорядоченными объектами 22
  • 23. Ordering ● Ordering<T> - наследник Comparator<T> ● В Ordering реализованы методы использующие порядок: min, max, sort и т.д. 23
  • 24. Ordering<T>. Создание ● Ordering.natural() - естественный порядок, основанный на функции compare(T,T) ● Ordering.usingToString() - лексикографический порядок, строковых представлений (toString) ● Ordering.from(Comparator) ● Наследник Ordering 24
  • 25. Ordering<T>. Использование greatestOf(Iterable iterable, int k) See also: leastOf isOrdered(Iterable) See also: isStricklyOrdered sortedCopy(Iterable) See also: immutableSortedCopy min(E, E) See also: max(E, E) min(E, E, E, E...) See also: max(E, E, E, E...) min(Iterable) See also: max(Iterable), min(Iterator), max(Iterator) 25
  • 26. FirstName Ordering private static Ordering<Person> FIRST_NAME_ORDERING = Ordering.natural().nullsFirst().onResultOf(new Function<Person, String>() { @Override public String apply(Person input) { return input.getFirstName(); } }); 26
  • 27. Age Ordering private static Ordering<Person> AGE_ORDERING = Ordering.natural().onResultOf(new Function<Person, Integer>() { @Override public Integer apply(Person input) { return input.getAge(); } }); 27
  • 28. Список Person private static List<Person> createPersonList() { return Lists.newArrayList( new Person("Egor", "Chernyshev", 24), new Person("Anton", "Borisov", 36), new Person("Elena", "Petrova", 18), new Person("Maxim", "Lobanov", 65), new Person(null, "Alexandrova", 24)); } 28
  • 29. Ordering<T>. Примеры List<Person> persons = createPersonList(); out.println("isOrdered =" + FIRST_NAME_ORDERING.isOrdered(persons)); // isOrdered =false Collections.sort(persons, FIRST_NAME_ORDERING); out.println(persons);// [Person{lastName=Alexandrova, firstName=null, age=24}, // Person{lastName=Borisov, firstName=Anton, age=36}, // Person{lastName=Chernyshev, firstName=Egor, age=24}, // Person{lastName=Petrova, firstName=Elena, age=18}, // Person{lastName=Lobanov, firstName=Maxim, age=65}] out.println("isOrdered =" + FIRST_NAME_ORDERING.isOrdered(persons)); // isOrdered =true out.println(AGE_ORDERING.max(persons)); // Person{lastName=Lobanov, firstName=Maxim, age=65} out.println(AGE_ORDERING.min(persons)); // Person{lastName=Petrova, firstName=Elena, age=18} 29
  • 30. Ordering<T>. Примеры Ordering<Person> compound = Ordering.compound(Lists.newArrayList(AGE_ORDERING, FIRST_NAME_ORDERING)); List<Person> compoundSortedPersons = compound.sortedCopy(createPersonList()); out.println(compoundSortedPersons); // [Person{lastName=Petrova, firstName=Elena, age=18}, // Person{lastName=Alexandrova, firstName=null, age=24}, // Person{lastName=Chernyshev, firstName=Egor, age=24}, // Person{lastName=Borisov, firstName=Anton, age=36}, // Person{lastName=Lobanov, firstName=Maxim, age=65}] 30
  • 31. GUAVA Collections ● ImmutableCollections ● Новые коллекции в Guava ● Утилитарные классы Sets, Lists, Maps… ● Утилиты для расширения java коллекций 31
  • 33. Чем хороши Immutable objects? ● Безопасное использование в untrusted библиотеках. ● Потоко безопасны. ● Хороши для хранения констант, так как есть гарантия неизменяемости. 33
  • 34. Interface JDK или Guava Immutable version Collection JDK ImmutableCollection List JDK ImmutableList Set JDK ImmutableSet SortedSet / NavigableSet JDK ImmutableSortedSet Map JDK ImmutableMap SortedMap JDK ImmutableSortedMap 34 Multiset Guava ImmutableMultiset
  • 35. Interface JDK или Guava Immutable version SortedMultiset Guava ImmutableSortedMultiset Multimap Guava ImmutableMultimap ListMultimap Guava ImmutableListMultimap SetMultimap Guava ImmutableSetMultimap BiMap Guava ImmutableSetMultimap ClassToInstanceM ap Guava ImmutableClassToInstanceMap 35 Table Guava ImmutableTable
  • 36. ImmutableCollection. Создание ● ImmutableXXX.of ● ImmutableXXX.copyOf ● ImmutableXXX.builder() 36
  • 37. ImmutableXXX.of ImmutableList<Person> GROUP = ImmutableList.of( new Person("Egor", "Chernyshev", 24), new Person("Anna", "Tarasova", 30)); ImmutableSet<String> ALPHABET = ImmutableSet.of("a", "b", "c"); ImmutableMap<String, Integer> CHAR_NUMBERS = ImmutableMap.of("a", 1, "b", 2); ImmutableXXX.copyOf ImmutableList<Person> COPY_OF_GROUP = ImmutableList.copyOf(GROUP); 37
  • 38. ImmutableXXX.builder() ImmutableList<Person> GROUP_B = ImmutableList .<Person>builder() .addAll(GROUP) .add(new Person("Anton", "Belov", 41)) .build(); 38
  • 39. copyOf умнее, чем вы думаете ● copyOf пытается избежать полного копирования объектов. ● В общем случае ImmutableXXX.copyOf (ImmutableXXX) пытается выполнится за O(1), за исключением некоторых случаев 39
  • 40. исключения ● ImmutableSet.copyOf(ImmutableList) ● ImmutableList<String> hugeList; ImmutableList.copyOf(hugeList.subList(0, 10)) ● ImmutableSet.copyOf (myImmutableSortedSet) 40
  • 42. Multiset Мультимножество: {a, a, b, c, f, d} Эквивалентность: {a, a, b} = {a, b, a} 42
  • 43. Multiset. Пример Подсчет количества каждого символа в тексте: Multiset<Character> toCharsMultiset(String text) { return HashMultiset.create(Chars.asList(text.toCharArray())); } 43
  • 44. Multiset. Реализации Map Соответствующий Multiset Допускает null? HashMap HashMultiset Да TreeMap TreeMultiset Да (если компаратор поддерживает) LinkedHashMap LinkedHashMultiset Да ConcurrentHashMap ConcurrentHashMultiset Нет ImmutableMap ImmutableMultiset Нет 44
  • 46. Multimap Map<K, List<V>> Map<K, Set<V>> Multimap<K, V> a->1, a->2, a->4, b->3, c->5 или a->[1, 2, 4], b->3, c->5 46
  • 47. Multimap<K,V>. Представления Multimap<K,V>.asMap() Map<K, Collection<V>> Multimap<K,V>.entries() Collection<Entry<K,V>> Multimap<K,V>.keySet() Set<K> Multimap<K,V>.keys() Multiset<K> Multimap<K,V>.values() Collection<V> 47
  • 48. Multimap<K,V>. Реализации Реализация Ключи ведут себя как... Значения ведут себя как... ArrayListMultimap HashMap ArrayList HashMultiMap HasMap HashSet LinkedListMultimap LinkedHashMap LinkedList LinkedHashMultiMap LinkedHashMap LinkedHashSet TreeMultimap TreeMap TreeSet ImmutableListMultimap ImmutableMap ImmutableList ImmutableSetMultimap ImmutableMap ImmutableSet 48
  • 49. Multimap. Пример private static Function<Person, String> FIRST_NAME_EXTRACTOR = new Function<Person, String>() { @Override public String apply(Person input) { return input.getFirstName(); } }; 49
  • 50. Multimap. Пример List<Person> PERSONS = Lists.newArrayList( new Person("Egor", "Chernyshev", 24), new Person("Anton", "Borisov", 36), new Person("Elena", "Petrova", 18), new Person("Elena", "Birkova", 11), new Person("Maxim", "Lobanov", 65)); Multimap<String, Person> index = Multimaps.index(PERSONS, FIRST_NAME_EXTRACTOR); 50
  • 52. BiMap<K,V> BiMap<V, K> - это Map<K, V>, в которой ● Добавлен метод BiMap<V, K> inverse(). ● Есть проверка на уникальность значений. ● values() возвращает Set<V>. 52
  • 53. BiMap<K,V>. Реализации Key-Value Map Value-Key Map Реализация HashMap HashMap HashBiMap ImmutableMap ImmutableMap ImmutableBiMap EnumMap EnumMap EnumBiMap EnumMap HashMap EnumHashBiMap 53
  • 55. Table<R, C, V> ● Table - это способ хранения индекса объекта по двум ключам R и C. ● Table<R,C,V> заменяет неуклюжую реализацию структуры Map<R, Map<C, V>> 55
  • 56. Table<R, C, V>. Представления Table<R,C,V>.rowMap() Map<R, Map<C,V>> Table<R,C,V>.rowKeySet() Set<R> Table<R,C,V>.row(r) Map<C,V> columnMap(), columnKeySet(), column(c) Аналогично, row. Column access по производительности работает медленнее, чем row access из за структуры данных. Table<R,C,V>.cellSet() Set<Table.Cell<R,C,V>> 56
  • 57. Table<R, C, V>. Реализации Реализация На основе структуры HashBasedTable HashMap<R, HashMap<C, V>> TreeBasedTable TreeMap<R, TreeMap<C, V>> ImmutableTable ImmutableMap<R, ImmutableMap<C, V>> ArrayTable Двумерный массив. Хорошо подходит для задач, с сильно заполненными таблицами. 57
  • 59. ClassToInstanceMap<B> ● Реализация Map<Class<? extends B>, B> ● Поддерживает примитивы Реализации: ● ImmutableClassToInstanceMap ● MutableClassToInstanceMap 59
  • 60. public interface MegaService {} public class SuperMegaService implements MegaService{} public class SuperMegaBupperService implements MegaService{} … private static final ClassToInstanceMap<MegaService> REGISTRY = MutableClassToInstanceMap.create(); … REGISTRY.putInstance(SuperMegaService.class, new SuperMegaService());// OK REGISTRY.putInstance(SuperMegaBupperService.class, new SuperMegaBupperService());// OK REGISTRY.putInstance(MegaService.class, new SuperMegaBupperService());// OK REGISTRY.putInstance(SuperMegaService.class, new SuperMegaBupperService()); // Ошибка компиляции REGISTRY.putInstance(String.class, "qqqq"); // Ошибка компиляции REGISTRY.put(String.class, "qqqq"); // Ошибка компиляции REGISTRY.getInstance(MegaService.class);// OK REGISTRY.getInstance(String.class);// Ошибка компиляции 60
  • 62. RangeSet<C extends Comparable> ● JDK 1.6 + ● Не поддерживается в GWT RangeSet<Integer> rangeSet = TreeRangeSet.create(); rangeSet.add(Range.closed(1, 10)); // {[1, 10]} rangeSet.add(Range.closedOpen(11, 15)); // disconnected range: {[1, 10], [11, 15)} rangeSet.add(Range.closedOpen(15, 20)); // connected range; {[1, 10], [11, 20)} rangeSet.add(Range.openClosed(0, 0)); // empty range; {[1, 10], [11, 20)} rangeSet.remove(Range.open(5, 10)); // splits [1, 10]; {[1, 5], [10, 10], [11, 20)} 62
  • 63. RangeSet<C>. Представления RangeSet<C>.subRangeSet(Range<C>) RangeSet<C> RangeSet<C>.asRanges() Set<Range<C>> RangeSet<C>.asSet(DiscreteDomain<C>) только ImmutableRangeSet ImmutableSortedSet<C> 63
  • 64. RangeSet<C>. Запросы Метод Возвращаемое значение RangeSet<C>.contains(C) boolean RangeSet<C>.rangeContaining(C) Range<C> RangeSet<C>.encloses(Range<C>) boolean RangeSet<C>.span() Range<C> 64
  • 66. Collections Utils Коллекция JDK или Guava Класс с утилитами Collection JDK Collections2 List JDK Lists Set JDK Sets SortedSet JDK Sets Map JDK Maps SortedMap JDK Maps 66 Queue JDK Queues
  • 67. Collections Utils Коллекция JDK или Guava Класс с утилитами Multiset Guava Multisets Multimap Guava Multimaps BiMap Guava Maps Table Guava Tables 67
  • 68. Static constructors List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<TypeThatsTooLongForItsOwnGood>(); ------------------------------------------------------------------------------------------ List<TypeThatsTooLongForItsOwnGood> list1 = Lists.newArrayList(); Map<KeyType, LongishValueType> map = Maps.newLinkedHashMap(); ------------------------------------------------------------------------------------------ List<TypeThatsTooLongForItsOwnGood> list2 = new ArrayList<>(); ------------------------------------------------------------------------------------------ Set<Type> copySet = Sets.newHashSet(elements); List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma"); ------------------------------------------------------------------------------------------ List<Type> exactly100 = Lists.newArrayListWithCapacity(100); List<Type> approx100 = Lists.newArrayListWithExpectedSize(100); Set<Type> approx100Set = Sets.newHashSetWithExpectedSize(100); ------------------------------------------------------------------------------------------ Multiset<String> multiset = HashMultiset.create(); 68
  • 69. Iterables ● Guava предпочитает Iterable вместо Collection ● Многие Iterable являются Lazy ● Утилита FluentItrable, оборачивает Iterable и предоставляет набор методов для работы в функцинальном стиле. 69
  • 70. Lists Метод Описание partiton(List, int) List<List> - разбиение списка на подсписки определенной длины. reverse(List) Развернутое представление списка 70
  • 71. Sets Метод Описание union(Set, Set) Объединение множеств intersection(Set, Set) Пересечение difference(Set, Set) Разность symmetricDifference(Set, Set) симметричная разность powerSet(Set) Множество всех подмножеств 71
  • 73. Maps.uniqueIndex() Maps.uniqueIndex(Lists.newArrayList("dddd", "ddddd", "qwcccccde"), new Function<String, Integer>() { @Override public Integer apply(String input) { return input.length(); } }); //{4=dddd, 5=ddddd, 9=qwcccccde} ● Выбросится ошибка, если Function 73 вернет неуникальное значение
  • 74. MapDifference d = Maps.difference() entriesOnlyOnLeft() entriesInCommon() entriesOnlyOnRight() entriesDiffering() 74
  • 75. Multimaps Метод Описание index(Iterable, Function) Построение индекса коллекции по ключевой функции invertFrom(Multimap, Multimap) Разворот Map’ы (<K,V> -> <V,K>) forMap(Map) Преобразвание Map<K,V> в Multimap<K,V> 75
  • 76. Tables Метод Описание transpose(Table<R,C,V>) Транспонирование таблицы Table<R,C,V> -> Table<C,R,V> 76
  • 77. Extention utilities ● Forwarding Decorators ● PeekingIterator ● AbstractIterator 77
  • 78. Forwarding Decorators. Пример class AddLoggingList<E> extends ForwardingList<E> { final List<E> delegate; // backing list @Override protected List<E> delegate() { return delegate; } @Override public void add(int index, E elem) { log(index, elem); super.add(index, elem); } @Override public boolean add(E elem) { return standardAdd(elem); // implements in terms of add(int, E) } @Override public boolean addAll(Collection<? extends E> c) { return standardAddAll(c); // implements in terms of add } } 78
  • 79. Forwarding Decorators Interface Forwarding decorator Collection ForwardingCollection List ForwardingList Set ForwardingSet SortedSet ForwardingSortedSet Map ForwardingMap SortedMap ForwardingSortedMap ConcurrentMap ForwardingConcurrentMap 79 Map.Entry ForwardingMapEntry
  • 80. Forwarding Decorators Interface Forwarding decorator Queue ForwardingQueue Iterator ForwardingIterator ListIterator ForwardingListIterator Multiset ForwardingSortedSet Multimap ForwardingMultiset ListMultiMap ForwardingListMultiMap SetMultimap ForwardingSetMultimap 80
  • 81. PeekingIterator List<String> result = Lists.newArrayList(); PeekingIterator<String> iter = Iterators.peekingIterator(source.iterator()); while (iter.hasNext()) { String current = iter.next(); while (iter.hasNext() && iter.peek().equals(current)) { // skip this duplicate element iter.next(); } result.add(current); } 81
  • 82. AbstractIterator public static Iterator<String> skipNulls(final Iterator<String> in) { return new AbstractIterator<String>() { protected String computeNext() { while (in.hasNext()) { String s = in.next(); if (s != null) { return s; } } return endOfData(); } }; } 82
  • 83. Caches Кэширование информации в памяти. Применимость, создание кэшей, использование примеры. 83
  • 84. Cache. Применимость ● Память -> Скорость ● Элемент используется больше 1 раза ● Все кэшируемые значения помещаются в оперативной памяти 84
  • 85. Cache. Создание Cache<String, Person> cache = CacheBuilder .newBuilder() .expireAfterAccess(5, TimeUnit.MINUTES) .maximumSize(10000) .build(); 85
  • 86. Cache. Добавление значения CacheLoader /** * Медленная операция получения человека по Web сервису * из внешней системы */ private Person loadPersonByWebService(String key) { return new Person("Anton", "Borisow", 88); } 86
  • 87. Cache. Добавление значения CacheLoader Cache<String, Person> cache = CacheBuilder .newBuilder() .expireAfterAccess(5, TimeUnit.MINUTES) .maximumSize(10000) .build(new CacheLoader<String, Person>() { @Override public Person load(String key) throws Exception { return loadPersonByWebService(key); } }); 87
  • 88. Cache. Добавление значения from Callable try{ cache.get(key, new Callable<Person>(){ @Override public Person call() throws Exception { return loadPersonByWebService(key); } }); } catch (ExecutionException e) { throw new RuntimeException(e.getMessage(), e); 88 }
  • 89. Cache. Добавление значения directly insert cache.put(key, loadPersonByWebService(key)); 89
  • 90. Cache. Eviction ● Size-base eviction ● Timed eviction ● Reference-based eviction ● Explicit eviction ● Removal Listener 90
  • 91. Cache. Size-based eviction ● CacheBulder.maximumSize(long) ● CacheBuilder.maximumWeight(long) ● CacheBuilder.weighter(Weighter<K,V>) 91
  • 92. Cache. Timed eviction ● CacheBuilder.expireAfterWrite(long, TimeUnit) ● CacheBuilder.expireAfterAccess(long, TimeUnit) 92
  • 93. Cache. Reference-based eviction ● CacheBulder.weakKeys() ● CacheBuilder.weakValues() ● CacheBuilder.softValues() 93
  • 94. Cache. Explicit removals ● Cache.invalidate(key) ● Cache.invalidateAll(keys) ● Cache.invalidateAll() 94
  • 95. Cache. Когда происходит eviction ● В момент записи нового значения ● Иногда (если записей в кэш мало) при получении значения по ключу ● Кэш не обслуживается отдельным 95 потоком!
  • 96. Cache. Прочие возможности ● Statistic: Включение: CacheBuilder.recordStats(); Получение: CacheStats stats = Cache.stats(); Использование: ● stats.hitRate() - количество попаданий ● stats.averageLoadPenalty() - среднее время на загрузку новых значений ● stats.evictionCount() - количество eviction’ов ● asMap 96
  • 97. Мощные, простые инструменты для написания корректного многопоточного кода ListenableFutures, Service, Striped 97
  • 98. ListenableFuture ● Расширяет Future - позволяет регистрировать Callback на момент выполнения операции. ● Callback будет вызван один раз. ● Callback обрабатывает ошибки с помщью onFaiture() метода. 98
  • 99. DocumentLoaderService private ListeningExecutorService executorService = MoreExecutors .listeningDecorator(Executors.newFixedThreadPool(5)); … public void loadDocument(final String docUrl, FutureCallback<String> callback){ ListenableFuture<String> future = executorService.submit(new Callable<String>(){ @Override public String call() throws Exception{ return IOUtils.toString(docUrl, StandardCharsets.UTF_8.name()); } }); Futures.addCallback(future, callback); } 9 9 …
  • 100. DocumentLoaderService. Использование DocumentLoaderService service = DocumentLoaderService.instance(); for (String url : TESTED_URLS) { service.loadDocument(url, new FutureCallback<String>(){ @Override public void onSuccess(String result){ handleDocument(result); } @Override public void onFailure(Throwable t){ handleError(t); } }); } 100
  • 102. Service ● Интерфейс Service - это объект с рабочим состоянием и методами остановки и запуска. ● Service имеет ряд предопределенных состояний. ● Существуют базовые абстрактные реализации, которые необходимо переопределять для написания собственных 102 служб и сервисов.
  • 103. Использование Service NEW STARTING RUNNING STOPPING TERMINATED Метод Описание startAsync() Запуск stopAsync() Остановка state() Статус 103
  • 104. Serivce. Базовые реализации ● AbstractIdleService ● AbstractExecutionThreadService ● AbstractScheduledService ● AbstractService 104
  • 105. ServiceManger Метод Описание startAsync() Стартует все службы stopAsync() Останавливает все службы addListener Добавление листенеров на смены статусов awaitHealthy() дождаться пока все службы не станут RUNNING awaitStopped() дождаться пока все службы не будут остановлены isHealthy() true, если все службы RUNNING servicesByState() ultimap сервисов сгрупированных по состояниям 105 startupTimes() Map сервисов с временами старта. Отсортированная
  • 107. Striped. Пример private Lock lock = new ReentrantLock(); public void runAction(String key) { lock.lock(); try { threadSafeActionWithResource(getResource(key)); } finally { lock.unlock(); } } 107
  • 108. Striped. Пример private Striped<Lock> striped = Striped.lazyWeakLock(2); public void runAction(String key) { Lock lock = striped.get(key); lock.lock(); try { threadSafeActionWithResource(getResource(key)); } finally { lock.unlock(); } } 108
  • 109. Прочие утилиты Strings, Joiner, Splitter, CharMatcher и пр. 109
  • 110. Strings Метод Описание isNullOrEmpty(str) true,если str == null или str.length() == 0 nullToEmpty(str) Преобразуется null в “” emptyToNull(str) Преобразует “” в null repeat(str, int) Повторяет str строку int раз 110
  • 111. Joiner Joiner joiner = Joiner.on(", ").useForNull("null"); List<String> parts = Lists.newArrayList("alpha", "beta", "gamma"); parts.add(null); String joined = joiner.join(parts); // alpha, beta, gamma, null 111
  • 112. Splitter Iterable<String> splited = Splitter .on(",") .omitEmptyStrings() .split("aa,,ddd,,bb,b,bbbb,ffd"); //[aa, ddd, bb, b, bbbb, ffd] 112
  • 114. Primitives Примитивный тип Утилиты byte Bytes, SignedBytes, UnsignedBytes short Shorts int Ints, UnsignedInteger, UnsignedInts long Longs, UnsignedLong, UnsignedLongs float Floats double Doubles char Chars 114 boolean Booleans
  • 116. Math IntMath, LongMath, BigIntegerMath 116
  • 117. Hashing ● md5 ● sha256 ● sha1 ● sha512 ● murmur2_128 ● murmur3_32 117
  • 118. Вопросы? Егор Чернышев email: egrik1990@gmail.com Skype: egrik1990