References
...base
문자(열) 관련
Ascii
아스키 문자(열)에 대한 상수, 유틸리티 제공
CharMatcher
char 단위 문자(열)에 대한 매칭 수행. 보충 평면 글자는 지원하지 않음에 주의
Joiner
- 각 객체의 toString() 결과를 Appendable 객체에 append
- skipNulls(), useForNull(String) 설정이 없는 경우, null 인자에 대해 NullPointerException 발생
↓java
static Joiner on(String separator)
Joiner.MapJoiner withKeyValueSeparator(String keyValueSeparator)
<A extends Appendable> appendTo(A appendable, ...)
String join(...)
Splitter
고정된 구분자(패턴)을 이용해 겹치지 않는 부분 문자열 획득
↓java
static Splitter fixedLength(int length) // 고정 길이로 자르기
static Splitter on(Pattern separatorPattern)
Splitter limit(int maxItems)
Splitter omitEmptyStrings()
Splitter trimResults() // 연속되는 공백 문자 제거
Splitter trimResults(CharMatcher trimmer) // trimmer에 해당하는 모든 연속적인 문자 제거
Splitter.MapSplitter withKeyValueSeparator(Splitter keyValueSplitter)
Iterable<String> split(CharSequence sequence)
List<String> splitToList(CharSequence sequence)
Stream<String> splitToStream(CharSequence sequence)
Strings
↓java
static String nullToEmpty(String string)
static String emptyToNull(String string)
static boolean isNullOrEmpty(String string)
static String repeat(String string, int count)
static String padStart(String string, int minLength, char padChar)
static String commonPrefix(CharSequence a, CharSequence b) // + commonSuffix
GC
FinalizableReference
↓java
void finalizeReferent() // GC 이후 실행할 작업 정의
FinalizableSoftReference<T>
SoftReference + FinalizableReference
FinalizableWeakReference<T>
WeakReference + FinalizableReference
FinalizablePhantomReference<T>
PhantomReference + FinalizableReference
FinalizableReferenceQueue
백그라운드 스레드로 FinalizableReference::finalizeReferent()를 실행하는 ReferenceQueue
ETC
Converter<A,B>
A -> B, B -> A 양방향 변환이 존재할 때, 그 변환
↓java
static <A,B> Converter<A,B> from(Function<? super A,? extends B> forwardFunction, Function<? super B,? extends A> backwordFunction)
B convert(A a) // null은 항상 null로
Iterable<B> convertAll(Iterable<? extends A> fromIterable)
Converter<B,A> reverse()
<C> Converter<A,C> andThen(Converter<B,C> secondConverter)
Defaults
자바 언어 명세에 따라 임의 타입에 대한 기본값을 반환
Enums
↓java
static Field getField(Enum<?> enumValue)
static <T extends Enum<T>> Optional<T> getIfPresent(Class<T> enumClass, String value)
static <T extends Enum<T>> Converter<String,T> stringConverter(Class<T> enumClass)
// Enum.name()을 이용한 Converter 반환
Preconditions
↓java
static void checkArgument(boolean expression, errorMessage(Template)[, errorMessageArgs])
// 메서드 매개변수 테스트
static void checkState(boolean expression, errorMessage(Template)[, errorMessageArgs])
// 인스턴스 상태 테스트
static <T extends Object> checkNotNull(T obj, errorMessage(Template)[, errorMessageArgs])
Stopwatch
- System.nanoTime()을 이용하여 경과 시간 측정
↓Android의 경우
// 앱이 슬립 상태가 되면 더 이상 실행되지 않으므로,
Stopwatch.createStarted(
new Ticker() {
public long read() {
return android.os.SystemClock.elapsedRealtimeNanos();
}
});
- 벽시계 System.currentTimeMillis()는 근사값이며, 주기적인 조정을 거치므로 부정확하다
↓java
static Stopwatch createStarted()
static Stopwatch createUnstarted()
Stopwatch start() + stop, reset
boolean isRunning()
Duration elapsed()
long elapsed(TimeUnit desiredUnit)
Suppliers
↓java
static <F,T> Supplier<T> compose(Function<? super F,T>, Supplier<F> supplier)
static <T> Supplier<T> memoize(Supplier<T> delegate)
static <T> Supplier<T> memoizeWithExpiration(Supplier<T> delegate, long duration, TimeUnit unit)
static <T> Supplier<T> ofInstance(T instance)
static <T> Function<Supplier<T>,T> supplierFunction()
static <T> Supplier<T> synchronizedSupplier(Supplier<T> delegate)
Throwables
↓java
static String getStackTraceAsString(Throwable throwable)
Verify
↓java
static void verify(boolean expression, errorMessage(Template)[, errorMessageArgs])
static <T> T verifyNotNull(T reference, errorMessage(Template)[, errorMessageArgs])
...cache
Cache<K,V>
스레드-안전한 캐시. 보통 CacheBuilder로 인스턴스 획득
↓java
V getIfPresent(Object key)
V get(K key, Callable<? extends V> loader)
// 캐시에 없으면 loader를 통해 새로 저장하고 반환
ImmutableMap<K,V> getAllPresent(Iterable<?> keys)
ConcurrentMap<K,V> asMap()
void put(K key, V value)
void putAll(Map<? extends K,? extends V> m)
void invalidate(Object key)
void invalidateAll(Ierable<?> keys)
long size()
CacheStats stats()
// 구현에 따라 기록 여부가 다를 수 있다
// CacheBuilder의 경우, recordStats()를 호출한 경우에만 기록
void cleanUp()
// 구현에 따라 필요한 경우, 정리 연산 수행
LoadingCache<K,V>
키가 캐시에 없는 경우(벌크 연산 getAll 포함) loader를 통해 새로 저장하고 반환한다
↓java
V get(K key) // getUnchecked(K)의 경우 RuntimeException을 던진다
ImmutableMap<K,V> getAll(Iterable<? extends K> keys)
void refresh(K key) // loader를 통해 값을 갱신한다
CacheBuilder<K,V>
- 자동 loading 설정 가능
- LRU 옵션 설정 가능
- 마지막 접근/쓰기 후 t 시간 경과하면 자동 삭제 설정 가능
- 키/값 자동 WeakReference 래핑 설정 가능
WeakReference 사용 설정된 경우, equals() 대신 identity(==) 비교를 이용한다
- 삭제된 엔트리에 대한 리스너 설정 가능
- 캐시 통계 기록 가능
- CacheBuilder를 통해 만든 캐시는 직렬화/역직렬화 가능하다. 다만, 캐시 설정 정보만 저장/복원된다
- refresh 연산은 기본적으로 LoadingCache.refresh(K) -> CacheLoader.reload(K, V)를 통해 수행된다
↓java
<K1 extends K,V1 extends V> CacheBuilder<K1,V1> weigher(Weigher<? super K1,? super V1> weigher)
// Weigher : (key, value) 쌍으로부터 상대적인 우선순위를 반환. 낮을수록 높다
// 호출 객체와 다른 객체가 반환되나, 둘 다 이용 가능하다. 다만 반환된 제네릭 객체는 타입-안전이 보장된다
CacheBuilder<K,V> ticker(Ticker ticker)
// 지정하지 않은 경우 System.nanoTime()을 기본 사용
<K1 extends K,V1 extends V> CacheBuilder<K1,V1> removalListener(RemovalListener<? super K1,? super V1> listener)
// 이 안에서 발생하는 예외는 전파되지 않고 Logger로만 기록된다
// GC로 인해 제거된 경우, 키/값은 null일 수 있다
<K1 extends K,V1 extends V> Cache<K1,V1> build()
<K1 extends K,V1 extends V> LoadingCache<K1,V1> build(CacheLoader<? super K1,V1> loader)
CacheBuilderSpec
- 캐시 설정을 외주할 수 있다
↓java
var spec = "maximumSize=10000,expireAfterWrite=10m";
var graphs = CacheBuilder.from(spec)
.removalListener(MY_LISTENER)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});
- Duration은 정수 + [smhd]로 표현
concurrencyLevel=[integer] | CacheBuilder.concurrencyLevel |
initialCapacity=[integer] | CacheBuilder.initialCapacity |
maximumSize=[long] | CacheBuilder.maximumSize |
maximumWeight=[long] | CacheBuilder.maximumWeight |
expireAfterAccess=[duration] | CacheBuilder.expireAfterAccess(Duration) |
expireAfterWrite=[duration] | CacheBuilder.expireAfterWrite(Duration) |
refreshAfterWrite=[duration] | CacheBuilder.refreshAfterWrite(Duration) |
weakKeys | CacheBuilder.weakKeys() |
softValues | CacheBuilder.softValues() |
weakValues | CacheBuilder.weakValues() |
recordStats | CacheBuilder.recordStats() |
CacheLoader<K,V>
- LoadingCache에 사용되는 값 생성기
- 보통 load(K)만 구현하는 것으로 충분하다. 나머지는 선택적
↓java
static <K,V> CacheLoader<K,V> from(Function<K,V> function)
static <K,V> CacheLoader<K,V> asyncReloading(CacheLoader<K,V> loader, Executor executor)
// reload()가 동기적인 경우에만 유용
abstract V load(K key) // 최초 값 생성
ListenableFuture<V> reload(K key, V value) // 기존 값을 대체할 값 생성
RemovalListeners
↓java
static <K,V> RemovalListener<K,V> asynchronus(RemovalListener<K,V> listener, Executor executor)
Cache 대리자
ForwardingCache, ForwadingCache.SimpleForwardingCache, ForwadingLoadingCache, ForwadingLoadingCache.SimpleForwardingLoadingCache
...collect
Collection types
ImmutableCollection<E>
- 래핑한 collection을 변경하면 내용이 바뀌는 Collections.unmodifiableCollection()보다 강력
- null 원소를 허용하지 않는다
- 스레드-안전하다
- ImmutableList, ImmutableSet, ImmutableSortedSet, ImmutableMap, ImmutableSortedMap, ImmutableBiMap, ImmutableMultiset, ImmutableMultimap, ImmutableListMultimap, ImmutableSetMultimap, ImmutableTable
- ImmutableCollection.Builder<E>, ImmutableList.Builder<E> 등도 제공
BiMap<K,V>
- 1:1 대응 관계를 표현한다
- 구현체 : HashBiMap(K, V 둘 다 해시 가능), EnumBiMap(두 enum 간 대응), EnumHashBiMap
↓java
V forcePut(K key, V value) // put(K, V) 실행 전에 value와 관계된 모든 엔트리 제거
// 반환값 : 기존 key에 대응됐던 값
BiMap<V,K> inverse() // 반대 방향 뷰 반환
Multiset<E>
- Bag으로도 불리는 자료형. 값의 중복을 허용(최대 Integer.MAX_VALUE)한다
- 구현체 : HashMultiset(HashMap을 구현에 이용), LinkedHashMultiset(결정적 iteration), TreeMultiset(iteration 정렬 지정), EnumMultiset(모든 연산이 상수 시간), ConcurrentHashMultiset(동시성 추가, null 비허용)
Multimap<K,V>
- 하나의 키에 대해 여러 값을 매핑
- ListMultimap : List를 이용해 값 삽입 순서를 보존. 엔트리 중복 가능
관련 구현체 : ArrayListMultimap, LinkedListMultimap
- SetMultimap : Set을 이용해 값 중복 제거
관련 구현체 : HashMultimap, LinkedHashMultimap(삽입 순 iteration)
- SortedSetMultimap : 값집합을 정렬한 SetMultimap
관련 구현체 : TreeMultimap(키/값 각각 정렬)
↓java
Map<K,Collection<V>> asMap()
Multiset<K> keys()
Collection<V> replaceValues(K key, Iterable<? extends V> values)
// 이하 생략
↓Value uniqueness - ListMultimap
var m = MultimapBuilder.hashKeys().linkedListValues().<Integer, Integer>build();
m.put(1, 3);
m.put(2, 3);
m.put(1, 1);
m.put(1, 2);
m.put(1, 1);
assertEquals(5, m.size()); // 키-값 쌍 중복 제거 X
↓Value uniqueness - SetMultimap
var m = MultimapBuilder.hashKeys().hashSetValues().<Integer, Integer>build();
m.put(1, 3);
m.put(2, 3);
m.put(1, 1);
m.put(1, 2);
m.put(1, 1);
assertEquals(4, m.size()); // 키-값 쌍 중복 제거 O
Table<R,C,V>
- (행 key, 열 key) 쌍에 대한 값을 보존
- Sparse 데이터 표현에 좋다
- 행/열 모두로 조회 가능하지만, 일부 구현은 열로 조회하는 경우 성능이 좋지 않을 수 있다
- 메서드가 반환한 모든 Collection/Map은 테이블에 대한 writable view다
구현에 따라 테이블 변경 메서드를 지원하지 않거나, 메서드가 반환한 Collection/Map이 writable하지 않을 수 있다
- 구현체 : ArrayTable(고정 크기 2차원 배열 이용), HashBasedTable(linked hash table 이용), TreeBasedTable(행/열 키 각각을 정렬)
↓java
Set<Table.Cell<R,C,V>> cellSet()
Map<C,V> row(R rowKey) + column
Map<R,Map<C,V>> rowMap() + columnMap
ClassToInstanceMap<B>
Queue
EvictingQueue<E>
add()시, 최대 개수에 도달했다면 head 요소 삭제. 논리적으로 circular buffer와 동일
MinMaxPriorityQueue<E>
- A double-ended priority queue
최대 원소에 대해서도 상수 시간 접근이 가능하며, 최대 원소에 대한 연산도 지원
- 크기 제한을 설정하는 경우, 크기가 초과될 때마다 최대 원소 제거
Utility
Collections2
↓java
static <E> Collection<List<E>> permutations(Collection<E> elements)
// + orderedPermutations
Comparators
↓java
static <T,S extends T> Comparator<Iterable<S>> lexicographical(Comparator<T> comparator)
// Iterable을 사전순으로 정렬해준다
// e.g. [] < [1] < [1, 1] < [1, 2] < [2]
// + isInOrder, isInStrictOrder
static <T> Collector<T,?,List<T>> least(int k, Comparator<? super T> comparator)
// 최소 원소 k개를 고르는 스트림 최종연산
// + greatest
static <T> T min(@Nullable T a, @Nullable T b, Comparator<T> comparator) + max
ComparisonChain
↓java
ComparisonChain.start()
.compare(this.aString, that.aString)
.compare(this.anInt, that.anInt)
.result()
Iterators + Iterables
↓java
static <T> Iterator<T> cycle(T... elements)
static <T> PeekingIterator<T> peekingIterator(Iterator<? extends T> iterator)
static <T> T[] toArray(Iterator<? extends T> iterator, Class<T> type)
static int advance(Iterator<?> iterator, int numberToAdvance)
static <T> Iterator<T> concat(...)
static <T> Iterator<T> limit(Iterator<T>, int limitSize)
static <T> Iterator<T> consumingIterator(Iterator<T> iterator)
// 원소를 소비하면서 삭제. Iterator.remove()를 지원해줘야 다음 next()가 동작한다
static <T> UnmodifiableIterator<T> filter(Iterator<?> unfiltered, Class<T> desiredType)
static <T> UnmodifiableIterator<T> mergeSorted(...)
static <T> UnmodifiableIterator<List<T>> partition(...) + paddedPartition
static <F,T> Iterator<T> transform(Iterator<F> fromIterator, Function<? super F,? extends T> function)
static <T> boolean addAll(Collection<T> addTo, Iterator<? extends T> iterator)
// + removeAll, retainAll, removeIf
static <T> boolean all(Iterator<T> iterator, Predicate<? super T> predicate)
// + any, contains, elementsEqual
static <T> T find(Iterator<T> iterator, Predicate<? super T> predicate)
// + tryFind
static int frequency(Iterator<?> iterator, Object element
// + indexOf, size
static <T> T get(Iterator<? extends T> iterator, int position, T defaultValue)
// + getLast, getNext, getOnlyElement
Lists
Cartesian product, (Array|Linked|CopyOnWrite)List 생성 등
Maps
Set과 Function<K,V>를 이용한 Map 생성, 두 Map 사이의 차분, 필터링, 신규 맵 생성 등
MapMaker
- 유사 ConcurrentHashMap을 만든다
- weakKeys()를 지정하는 경우 equals() 대신 identity(==) 비교를 이용한다
Multimaps
Map<K, Collection<V>>로 변환, 필터링, Multimap<V,K>로 변환, 엔트리 일괄 변경 등
MultimapBuilder<K0,V0>
- K0, V0 : 각각 키, 값 upper bound
- hashKkeys() : hash table 사용
- linkedHashKeys() : hash table 사용 + 키 삽입 순서 기록
- treeKeys() : TreeMap 사용
- enumKeys() : EnumMap 사용
Multisets
Multiset 사이의 포함 관계, difference, sum, union 등
ObjectArrays
배열 접합, 새 배열 할당
Queues
(Blocking)Queue, ArrayDeque, PriorityQueue 생성 등
Sets
Cartesian product, 신규 집합 생성 등
Streams
↓java
static <T> Stream<T> stream(Iterable<T> iterable)
static <T> Stream<T> concat(Stream<? extends T>... streams)
static <A,B,R> Stream<R> zip(Stream<A> streamA, Stream<B> streamB, BiFunction<? super A,? super B,R> function)
static <A,B> void forEachPair(Stream<A> streamA, Stream<B> streamB, BiConsumer<? super A,? super B> consumer)
static <T,R> Stream<R> mapWithIndex(Stream<T> stream, Streams.FunctionWithIndex<? super T,? extends R> function)
static <T> Optional<T> findLast(Stream<T> stream)
Tables
값 일괄 변경, transpose(행-열 뒤집기) 등
Ranges
DiscreteDomain<C extends Comparable>
이산 자료형 전체 범위를 표현한다. 예를 들어, 정수 전체 집합은 표현할 수 있지만, 소수 전체 집합은 표현할 수 없다
↓java
static DiscreteDomain<BigInteger> bigIntegers()
// + integers, longs
C maxValue() + minValue // 없으면 NoSuchElementException
abstract C next(C value) + previous // 없으면 null
Range<C extends Comparable>
- 대소 관계가 있는 자료형에 대해, 임계값을 이용해 범위 1개를 표현한다
- (a..b), [a..b], (a..b], [a..b), (a..inf), [a..inf), (-inf..b), (-inf..b], (-inf..inf)
ContiguousSet<C extends Comparable>
DiscreteDomain 상에서의 Range 하나를 표현한다
RangeMap<K extends Comparable>
Range -> V 매핑을 표현한다
Forwawrding collections
ForwardingObject
- 장식자 패턴 구현을 위한 최상위 추상 클래스
- delegate()는 장식할 인스턴스를 반환하면 된다
- hashCode(), equals(Object)는 backing object로 포워딩하지 않는다
- ForwardingList, ForwardingMap, ... 등 interface-specific 서브클래스를 이용하거나, 직접 정의하면 된다
Others
Interner<E>
임의 불변 타입에서 String.intern()과 유사한 기능을 제공함을 표현
Interners
↓java
static <E> Interner<E> newStrongInterner() + weak
static Interners.InternerBuilder newBuilder()
Ordering
...escape
...eventbus
@interface Subscribe
이벤트 객체 하나만 인자로 받는 구독자 메서드 표시
@interface AllowConcurrentEvents
구독자 메서드가 스레드-안전함을 표시
EventBus
↓java
void register(Object object) // public @Subscribe 메서드를 갖는 구독자 등록
void post(Object event) // 이벤트 발행
AsyncEventBus
지정 Executor로 처리
DeadEvent
처리되지 않은 이벤트는 DeadEvent로 감싸여 한 번 더 발행된다
...graph
Graph<N>
- 지원 : 방향/무방향 그래프, self-loop 허용/비허용, 정점/간선에 대한 삽입 순서 보존/정렬/비정렬
- 인스턴스 획득은 GraphBuilder 이용
ValueGraph<N,V>
- Graph + 간선 가중치
- 인스턴스 획득은 ValueGraphBuilder 이용
Network<N,E>
- Graph + 모든 간선은 unique 객체
- 두 정점 사이에 복수의 간선을 허용할 수 있다
- 인스턴스 획득은 NetworkBuilder 이용
...hash
Hashing
adler32, crc32, crc32c, hmacMd5, hmacSha256, md5, sha512, ...
...html.HtmlEscapers
Escapers for HTML
...io
Files
java.io.File에 대한 확장. java.nio.Files에서 같은 기능을 많이 제공한다
↓java
static CharSource asCharSource(File file, Charset charset)
static CharSink asCharSink(File file, Charset charset, FileWriteMode... modes)
static void touch(File file)
static void createParentDirs(File file)
static MappedByteBuffer map(File file)
static String getFileExtension(String fullName)
static String getNameWithoutExtension(String file)
static Traverser<File> fileTraverser()
MoreFiles
java.nio.Files에 대한 확장
↓java
static CharSource asCharSource(Path path, Charset charset, OpenOption... options)
static CharSink asCharSink(Path path, Charset charset, OpenOption... options)
static ImmutableList<Path> listFiles(Path dir)
static Traverser<Path> fileTraverser()
static Predicate<Path> isDirectory(LinkOption... options) + isRegularFile
static void touch(Path path)static void touch(Path path)
static void createParentDirectories(Path path, FileAttribute<?>... attrs)
static String getFileExtension(Path path)
static String getNameWithoutExtension(Path path)
static void deleteRecursively(Path path, RecursiveDeleteOption... options)
static void deleteDirectoryContents(Path path, RecursiveDeleteOption... options)
LineReader
\n, \r, \r\n 무관하게 한 줄씩 읽을 수 있게 해준다
Resources
클래스패스 상의 리소스에 접근하는 유틸리티를 제공한다
...math
- IntMath, LongMath, DoubleMath, BigIntegerMath, BigDecimalMath
- Quantiles : 분위수 계산
...net
- HttpHeaders, MediaType : 상수 제공
- PercentEscaper, UrlEscapers : Escaper 제공
...primitives
- Array : ImmutableIntArray, ImmutableLongArray, ImmutableDoubleArray
- Type : UnsignedInteger, UnsignedLong
- Utility : Booleans, ..., Doubles, Primitives, UnsignedLongs
...reflect
TypeToInstanceMap<B>
- TypeToken -> instance 매핑
- ImmutableTypeToInstanceMap<B>, MutableTypeToInstanceMap<B>
ClassPath
ClassLoader로부터 모든 클래스, 리소스 스캔
Reflection
↓java
static String getPackageName(Class<?> clazz)
static String getPackageName(String classFullName)
// 클래스 이름만 파싱하여 패키지 이름을 판단한다
static <T> T newProxy(Class<T> interfaceType, InvocationHandler handler)
// 단일 인터페이스 프록시 생성에 편리
TypeToken<T>
↓java
// 인스턴스 획득 1
new TypeToken<List<String>>() {}
// 인스턴스 획득 2
abstract class IKnowMyType<T> {
TypeToken<T> type = new TypeToken<T>(getClass()) {};
}
new IKnowMyType<String>() {}.type => String
final <X> TypeToken<T> where(TypeParameter<X> typeParam, TypeToken<X> typeArg)
// 동적으로 제네릭 타입을 치환
// e.g.
static <K, V> TypeToken<Map<K, V>> mapOf(TypeToken<K> keyType, TypeToken<V> valueType) {
return new TypeToken<Map<K, V>>() {}
.where(new TypeParameter<K>() {}, keyType)
.where(new TypeParameter<V>() {}, valueType);
}
final TypeToken<?> resolveType(Type type)
// 제네릭 실제 타입 획득
// e.g.
new TypeToken<List<String>>() {}.resolveType(List.class.getMethod("get", int.class).getGenericReturnType())
== String.class
final TypeToken.TypeSet getTypes()
// 현재 타입 + 선조 타입 + 구현 인터페이스
// e.g. List<String> =>
// [java.util.List<java.lang.String>, java.util.Collection<java.lang.String>, java.lang.Iterable<java.lang.String>]
final TypeToken<? super T> getSupertype(Class<? super T> superclass)
final TypeToken<? extends T> getSubtype(Class<?> subclass)
// e.g.
var type1 = new TypeToken<List<String>>() {};
var type2 = type1.getSupertype(Iterable.class); == java.lang.Iterable<java.lang.String>
var type3 = type2.getSubtype(List.class); == java.util.List<java.lang.String>
final @Nullable TypeToken<?> getComponentType()
// 배열 원소 타입 반성
final Invokable<T,Object> method(Method method)
final Invokable<T,T> constructor(Constructor<?> constructor)
// + wrap, unwrap
// + isSupertypeOf, isSubtypeOf, isArray, isPrimitive
...util.concurrent
ListenableFuture<V>
↓java
void addListener(Runnable listener, Executor executor)
FluentFuture<V>
ListenableFuture에 체인 기능 추가
SettableFuture<V>
결과를 외부에서 설정 가능한 ListenableFuture
Futures
↓java
static <V> ListenableFuture<V> immediateFuture(@Nullable V value)
static ListenableFuture<Void> immediateVoidFuture()
static <V> ListenableFuture<V> immediateFailedFuture(Throwable throwable)
static <V> ListenableFuture<V> immediateCancelledFuture()
static <O> ListenableFuture<O> submit(Callable<O> callable, Executor executor)
static ListenableFuture<Void> submit(Runnable runnable, Executor executor)
static <O> ListenableFuture<O> submitAsync(AsyncCallable<O> callable, Executor executor)
static <O> ListenableFuture<O> scheduleAsync(AsyncCallable<O> callable, Duration delay, ScheduledExecutorService executorService)
static <V,X extends Throwable> ListenableFuture<V> catching(ListenableFuture<? extends V> input, Class<X> exceptionType, Function<? super X,? extends V> fallback, Executor executor)
static <V,X extends Throwable> ListenableFuture<V> catchingAsync(ListenableFuture<? extends V> input, Class<X> exceptionType, AsyncFunction<? super X,? extends V> fallback, Executor executor)
static <V> ListenableFuture<V> withTimeout(ListenableFuture<V> delegate, Duration time, ScheduledExecutorService scheduledExecutor)
static <I,O> ListenableFuture<O> transform(ListenableFuture<I> input, Function<? super I,? extends O> function, Executor executor)
static <I,O> ListenableFuture<O> transformAsync(ListenableFuture<I> input, AsyncFunction<? super I,? extends O> function, Executor executor)
static <I,O> Future<O> lazyTransform(Future<I> input, Function<? super I,? extends O> function)
// get() 호출이 있을 때 function 호출
static <V> ListenableFuture<List<V>> allAsList(ListenableFuture<? extends V>... futures)
static <V> ListenableFuture<List<V>> successfulAsList(ListenableFuture<? extends V>... futures)
static <T> ImmutableList<ListenableFuture<T>> inCompletionOrder(Iterable<? extends ListenableFuture<? extends T>> futures)
static <V> Futures.FutureCombiner<V> whenAllComplete(ListenableFuture<? extends V>... futures)
static <V> Futures.FutureCombiner<V> whenAllSucceed(ListenableFuture<? extends V>... futures)
static <V> ListenableFuture<V> nonCancellationPropagating(ListenableFuture<V> future)
// 출력 tufure를 취소해도 입력 future를 취소하지 않음
static <V> void addCallback(ListenableFuture<V> future, FutureCallback<? super V> callback, Executor executor)
static <V> V getDone(Future<V> future)
Futures.FutureCombiner<V>
다른 ListenableFuture들의 결과들을 이용하는 ListenableFuture
↓java
<C> ListenableFuture<C> callAsync(AsyncCallable<C> combiner, Executor executor)
<C> ListenableFuture<C> call(Callable<C> combiner, Executor executor)
ListenableFuture<?> run(Runnable combiner, Executor executor)
// e.g.
Futures.whenAllSucceed(loginDateFuture, recentCommandsFuture)
.call(
() ->
new UsageHistory(
username,
Futures.getDone(loginDateFuture),
Futures.getDone(recentCommandsFuture)),
executor);
ListeningExecutorService
Future 대신 ListenableFuture를 반환하는 ExecutorService
ListeningScheduledExecutorService
ScheduledFuture 대신 ListenableScheduledFuture를 반환하는 ScheduledExecutorService
Callables
↓java
static <T> AsyncCallable<T> asAsyncCallable(Callable<T> callable, ListeningExecutorService listeningExecutorService)
ClosingFuture<V>
↓java
// 비동기 연산에 사용된 자원을 자동으로 닫게 해준다
ClosingFuture.submit(
closer -> closer.eventuallyClose(database.newTransaction(), closingExecutor), executor)
.transformAsync((closer, transaction) -> transaction.queryClosingFuture("..."), executor)
.transform((closer, result) -> result.get("userName"), directExecutor())
.catching(DBException.class, e -> "no user", directExecutor())
.finishToFuture();
CycleDetectingLockFactory
lock 요구 시 사이클을 감지하는 ReentrantLock, ReentrantReadWriteLock 인스턴스 생성
Service
- 가동 상태(NEW -> STARTING -> RUNNING -> STOPPING -> TERMINATED / FAILED)와 연관 메서드를 갖는 객체
- 중간 구현체 : AbstractExecutionThreadService, AbstractIdleService, AbstractScheduledService, AbstractService
ServiceManager
서비스 집합 관리자
TimeLimiter
- 메서드 호출 제한 시간을 둔다
- 구현체 : SimpleTimeLimiter
RateLimiter
초당 permit 사용량을 제한한 세마포어
ThreadFactoryBuilder
스레드 이름, daemon 여부, 우선순위 등 설정 간소화
...xml.XmlEscapers
Escapers for XML