欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

guava笔记4-Function,Predicate 博客分类: guavajava相关

程序员文章站 2024-03-23 15:58:34
...

Function和Predicate可以说是Guava最好用的工具了。

Function用于把一种类型的对象转化为另一种类型的对象。
Predicate用于判断某个对象是否符合一定条件。

单用Function和Predicate可能还看不出他的强大,但是配合集合类,就可以极大地简化代码编写。

Function可以配合集合的transform方法,来将一个集合转换为另一个集合。
FluentIterable<Integer> rs = FluentIterable.from(strings) .transform(new Function<String, Integer>() {
       public Integer apply(String string) {
         return string.length();
       }
     }));

Predicate可以配合集合的filter方法,将一个集合符合条件的记录重新组成另一个集合。
FluentIterable<String> rs  =  FluentIterable.from(strings)
    .filter(new Predicate<String>() {
       public boolean apply(String string) {
         return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);
       }
     })

Functions中有些static方法可以快速得到常用的一些函数:
forMap(Map<A, B>) 以map作为函数
compose(Function<B, C>, Function<A, B>) 组合2个函数
constant(T) 返回常量T
identity() 返回值和输入参数相等的函数
toStringFunction() 使用toString方法返回的函数

Predicates中也有一些方法,可以快速得到一些常用的判断:
instanceOf(Class)
assignableFrom(Class)
contains(Pattern)
in(Collection)
isNull()
alwaysFalse()
alwaysTrue()
equalTo(Object)
compose(Predicate, Function)
and(Predicate...)
or(Predicate...)
not(Predicate)

基本上,很多集合的帮助类都提供了filter方法。返回的类型一般都跟传入的是一致的。
Iterables.filter(Iterable, Predicate)
Iterators.filter(Iterator, Predicate)
Collections2.filter(Collection, Predicate)
Sets.filter(Set, Predicate)
Sets.filter(SortedSet, Predicate)
Maps.filterKeys(Map, Predicate)
Maps.filterValues(Map, Predicate)
Maps.filterEntries(Map, Predicate)
Maps.filterKeys(SortedMap, Predicate)
Maps.filterValues(SortedMap, Predicate)
Maps.filterValues(SortedMap, Predicate)
Multimaps.filterKeys(Multimap, Predicate)
Multimaps.filterValues(Multimap, Predicate)
Multimaps.filterEntries(Multimap, Predicate)
注意:Lists没有提供filter方法,因为List没有办法高效的实现get(int)。
可以替代的这样实现filter:Lists.newArrayList(Collections2.filter(list, predicate)) 

FluentIterable里面还有个更加通用的filter方法:
FluentIterable.filter(Predicate),返回的FluentIterable<E>对象,可以使用集合的工厂方法构造所需要的集合类型。

Iterables 还提供了一些方法来根据Predicate来获取集合的元素:
boolean all(Iterable, Predicate)
boolean any(Iterable, Predicate)
T find(Iterable, Predicate)
T find(Iterable, Predicate, T default)
Optional<T> tryFind(Iterable, Predicate)
indexOf(Iterable, Predicate)
removeIf(Iterable, Predicate)

Iterators也有类似的方法:
Iterators.all(Iterator, Predicate)
Iterators.any(Iterator, Predicate)
Iterators.find(Iterator, Predicate)
Iterators.find(Iterator, Predicate, T default)
Iterators.indexOf(Iterator, Predicate)
Iterators.removeIf(Iterator, Predicate)

FluentIterable也有类似的方法:
FluentIterable.allMatch(Predicate)
FluentIterable.anyMatch(Predicate)
FluentIterable.firstMatch(Predicate)

类似于filter,guava的集合帮助类也提供了transform方法,来转换集合对象。
Iterables.transform(Iterable, Function)
Iterators.transform(Iterator, Function)
Collections2.transform(Collection, Function)
Lists.transform(List, Function)
Lists.transform(List, Function)
Maps.transformValues(Map, Function)
Maps.transformEntries(Map, EntryTransformer)
Maps.transformValues(SortedMap, Function)
Maps.transformEntries(SortedMap, EntryTransformer)
Multimaps.transformValues(Multimap, Function)
Multimaps.transformEntries(Multimap, EntryTransformer)
Multimaps.transformValues(ListMultimap, Function)
Multimaps.transformEntries(ListMultimap, EntryTransformer)
Tables.transformValues(Table, Function)
注意:Sets没有提供transform方法,因为Set没有办法提供高效的contains(Object)实现。
可以替代的这样实现transform:Sets.newHashSet(Collections2.transform(set, function))
EntryTransformer和Function类似,但是提供了EntrySet(key,value)到另一个对象的转换。

类似于filter,FluentIterable里面有更加通用的transform方法
FluentIterable.transform(Function),返回的FluentIterable<E>对象,可以使用集合的工厂方法构造所需要的集合类型。

除了集合类,还有些类可以和Function及Prediction配合使用:
Ordering.onResultOf(Function) 排序后的结果使用函数再做一次转换
Predicates.compose(Predicate, Function) 返回 predicate(function(x))
Equivalence.onResultOf(Function) 使用函数转换后再判断是否相等
Suppliers.compose(Function, Supplier) 对Supplier得到的值做一次转换
Functions.compose(Function, Function) 两次function

下一篇将介绍到的并发类 ListenableFuture  也可以配合Function使用,将ListenableFuture转换为新的ListenableFuture。
Futures.transform(ListenableFuture, Function)
Futures.transform(ListenableFuture, AsyncFunction)
Futures.transform(ListenableFuture, Function, Executor)
Futures.transform(ListenableFuture, AsyncFunction, Executor)