SlideShare une entreprise Scribd logo
1  sur  118
Télécharger pour lire hors ligne
Очень вкусный фрукт 
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

Contenu connexe

Tendances

Java Collections
Java CollectionsJava Collections
Java Collectionsparag
 
IBM JVM 소개 - Oracle JVM 과 비교
IBM JVM 소개 - Oracle JVM 과 비교IBM JVM 소개 - Oracle JVM 과 비교
IBM JVM 소개 - Oracle JVM 과 비교JungWoon Lee
 
Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)Koichi Sakata
 
[2019] Java에서 Fiber를 이용하여 동시성concurrency 프로그래밍 쉽게 하기
[2019] Java에서 Fiber를 이용하여 동시성concurrency 프로그래밍 쉽게 하기[2019] Java에서 Fiber를 이용하여 동시성concurrency 프로그래밍 쉽게 하기
[2019] Java에서 Fiber를 이용하여 동시성concurrency 프로그래밍 쉽게 하기NHN FORWARD
 
Exceptionhandling
ExceptionhandlingExceptionhandling
ExceptionhandlingNuha Noor
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Yuji Kubota
 
Deep drive into rust programming language
Deep drive into rust programming languageDeep drive into rust programming language
Deep drive into rust programming languageVigneshwer Dhinakaran
 
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料Nao Yamamoto
 
JavaOne 2013: Memory Efficient Java
JavaOne 2013: Memory Efficient JavaJavaOne 2013: Memory Efficient Java
JavaOne 2013: Memory Efficient JavaChris Bailey
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기Jong Wook Kim
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
Important features of java
Important features of javaImportant features of java
Important features of javaAL- AMIN
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr내훈 정
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective GitChanwoong Kim
 

Tendances (20)

Java Collections
Java CollectionsJava Collections
Java Collections
 
Java performance tuning
Java performance tuningJava performance tuning
Java performance tuning
 
What's new in Java 11
What's new in Java 11What's new in Java 11
What's new in Java 11
 
GC in C#
GC in C#GC in C#
GC in C#
 
IBM JVM 소개 - Oracle JVM 과 비교
IBM JVM 소개 - Oracle JVM 과 비교IBM JVM 소개 - Oracle JVM 과 비교
IBM JVM 소개 - Oracle JVM 과 비교
 
Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)Guide to GraalVM (JJUG CCC 2019 Fall)
Guide to GraalVM (JJUG CCC 2019 Fall)
 
[2019] Java에서 Fiber를 이용하여 동시성concurrency 프로그래밍 쉽게 하기
[2019] Java에서 Fiber를 이용하여 동시성concurrency 프로그래밍 쉽게 하기[2019] Java에서 Fiber를 이용하여 동시성concurrency 프로그래밍 쉽게 하기
[2019] Java에서 Fiber를 이용하여 동시성concurrency 프로그래밍 쉽게 하기
 
Exceptionhandling
ExceptionhandlingExceptionhandling
Exceptionhandling
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
 
Java8勉強会
Java8勉強会Java8勉強会
Java8勉強会
 
Java GC
Java GCJava GC
Java GC
 
Deep drive into rust programming language
Deep drive into rust programming languageDeep drive into rust programming language
Deep drive into rust programming language
 
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
SQLアンチパターン読書会 15章 ランダムセレクション 説明資料
 
JavaOne 2013: Memory Efficient Java
JavaOne 2013: Memory Efficient JavaJavaOne 2013: Memory Efficient Java
JavaOne 2013: Memory Efficient Java
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
Important features of java
Important features of javaImportant features of java
Important features of java
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
Maven
MavenMaven
Maven
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective Git
 

En vedette

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
 

En vedette (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
 

Similaire à Очень вкусный фрукт 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
 

Similaire à Очень вкусный фрукт 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