Guava(五)

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

目录

【函数式编程】
    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));     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值