目录
【函数式编程】
Guava推出的函数式编程起到简化代码的作用。但过度使用会造成代码的冗长、混乱、可读性差等缺点。此外,还可以了解下Java8中的函数式编程,但仅限于JDK8及以上的版本。
一、Function 函数
Function<F, T> 函数声明了一个 T apply(F input) 的方法,通过对输入F的操作,输出类型T的结果。
Function<Integer, String> function = new Function<Integer, String>() {
@Override
public String apply(Integer input) {
return input.toString();
}
};
下面看下常用的例子(例子只是为了简便而出,实际开发建议针对复杂类型使用)
// 接上述举例
List<Integer> list = Lists.newArrayList(1, 2, 3, 4);
List<String> transform = Lists.transform(list, function); // 将int转为String,[1, 2, 3, 4]
Map map = Maps.asMap(Sets.newHashSet(list), function); // {1=1, 2=2, 3=3, 4=4}
// Iterables 支持所有集合操作,同时也可以使用匿名内部类实现
Iterables.transform(list, new Function<Integer, Integer>() {
@Override
public Integer apply(Integer input) {
return input;
}
});
二、Predicate 断言
Predicate 它声明了一个 boolean apply(T input) 方法,返回布尔值。除了简单过滤,Guava另外提供了若干用Predicate处理Iterable的工具,通常在Iterables工具类中。
Predicate<Integer> predicate = new Predicate<Integer>() {
@Override
public boolean apply(Integer input) {
return input % 2 == 0;
}
};
List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7);
Iterables.find(list, predicate); // 查找首个偶数,2
Iterables.tryFind(list, predicate); // 查找首个偶数,返回Optional,2
Iterables.indexOf(list, predicate); // 查找首个偶数的下标,1
Iterables.all(list, predicate); // 是否所有元素是否为偶数
Iterables.any(list, predicate); // 是否存在偶数元素
Iterables.filter(list, predicate); // 只保留偶数,返回结果,不修改list,[2, 4, 6]
Iterables.removeIf(list, predicate); // 移除所有偶数,直接修改list,[1, 3, 5, 7]
三、Supplier 供应者
Supplier 中只有一个 T get() 无参方法,通常通过该方法用于返回一个新的实例对象。
Supplier<String> supplier = new Supplier<String>() {
@Override
public String get() {
return null;
}
};
四、Function组合
与集合工具类相似,Guava也提供了Functions、Predicates、Suppliers等方便操作的工具类。
Functions提供简便的Function构造和操作方法,包括:
| - | - | - |
|---|---|---|
| forMap(Map<A, B>) | compose(Function<B, C>, Function<A, B>) | constant(T) |
| identity() | toStringFunction() |
相应地,Predicates也提供了许多构造和处理Predicate的方法:
| - | - | - |
|---|---|---|
| instanceOf(Class) | assignableFrom(Class) | contains(Pattern) |
| in(Collection) | isNull() | alwaysFalse() |
| alwaysTrue() | equalTo(Object) | compose(Predicate, Function) |
| and(Predicate…) | or(Predicate…) | not(Predicate) |
补示例代码:
Function<String, Integer> lengthFunction = new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
};
Function<Integer, String> stringFunction = new Function<Integer, String>() {
@Override
public String apply(Integer input) {
return input.toString();
}
};
Predicate<String> evenPredicate = new Predicate<String>() {
@Override
public boolean apply(String input) {
return input.length() % 2 == 0;
}
};
List<Integer> list = Lists.newArrayList(12, 2, 321, 4);
// 将list元素转为字符串,再计算各字符串长度,[2, 1, 3, 1]
Iterables.transform(list, Functions.compose(lengthFunction, stringFunction));
// 将list元素转为字符串,找出字符串长度为偶数的元素,[12]
Iterables.filter(list, Predicates.compose(evenPredicate, stringFunction));

本文深入探讨了Guava库中的函数式编程概念,包括Function、Predicate和Supplier的使用,以及它们如何与集合工具类结合,提升Java代码的简洁性和可读性。通过具体示例,展示了如何进行数据转换、过滤和供应。
85万+

被折叠的 条评论
为什么被折叠?



