Guava全文介绍地址:Google Guava
这次主要介绍是的是com.google.common.base.Function.在JDK8之前Java是不能使用函数式编程的,但是Guava给予了我们这样的能力。Function就是这样其中的一个类。而且大多数时候Function是和Functions是组合来使用的,Function大概有以下用法:
1. 定义的函数可以用于执行操作(函数)在许多对象.
2. 它是用来转换集合使得它变成不同类型的集合.
3. 它主要是使用Colllections2, Lists, Iterables, Iterators, 等集合工具类中的transform()方法.
4. Function类提供了一些预定义的功能,并允许多个function组合成更复杂的Function(下面有例子).
这个接口包含以下两个方法。
T apply(F input)
用于对象转换
boolean equals(Object object)
判断另一个对象是否等于这个function
下面我们根据实际的例子来看怎么使用这个类。
基础类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User implements Serializable {
/** 身份证号 */
private long idCard;
/** 姓别(0 - 未知,1 - 男,2 - 女) */
private int gender;
/** 姓名 */
private String name;
}
1、一般用法
从集合对象中取出
@Test
public void gainNameForUser(){
// given
User user1 = new User(1L, 1, "carl");
User user2 = new User(2L, 1, "kevin");
User user3 = new User(3L, 2, "erin");
List<User> users = Lists.newArrayList(user1, user2, user3);
Function<User, String > nameFunction = new Function<User, String>() {
@Override
public String apply(User input) {
if(null == input){
return "";
}
return input.getName();
}
};
// when
Collection<String> names = Collections2.transform(users, nameFunction);
// then
assertThat(names).contains("carl", "kevin", "erin");
}
2、多个Function组合使用
@Test
public void shouldComposeTwoFunctions(){
// given
User user1 = new User(1L, 1, "carl");
User user2 = new User(2L, 1, "kevin");
User user3 = new User(3L, 2, "erin");
List<User> users = Lists.newArrayList(user1, user2, user3);
Function<User, String > nameFunction = new Function<User, String>() {
@Override
public String apply(User input) {
if(null == input){
return "";
}
return input.getName();
}
};
Function<String, String> upperCaseFunction = new Function<String, String>() {
@Override
public String apply(String input) {
if(null == input){
return "";
}
return input.toUpperCase();
}
};
Function<User, String> composedFunction = Functions.compose(upperCaseFunction, nameFunction);
// when
Collection<String> names = Collections2.transform(users, composedFunction);
// then
assertThat(names).contains("CARL", "KEVIN", "ERIN");
}
3、根据list的Key值,获取Map中对应的value值
@Test
public void shouldUseForMapFunction(){
// given
Map<String,String> map = Maps.newHashMap();
map.put("carl", "26");
map.put("kevin", "24");
map.put("erin", "25");
// when
Function<String, String> nameForAge = Functions.forMap(map);
List<String> names = Lists.newArrayList("carl", "kevin", "erin");
// then
Collection<String> ages = Collections2.transform(names, nameForAge);
assertThat(ages).containsOnly("24", "25", "26");
}
4、针对第3种情况,如果key值找不到对应的Value会报错,但是可以给默认值
@Test
public void shouldUseForMapFunctionWithDefaultValue(){
// given
Map<String,String> map = Maps.newHashMap();
map.put("carl", "26");
map.put("kevin", "24");
map.put("erin", "25");
// when
Function<String, String> nameForAge = Functions.forMap(map, "Unknown");
List<String> names = Lists.newArrayList("carl", "taylor");
// then
Collection<String> ages = Collections2.transform(names, nameForAge);
assertThat(ages).containsOnly("26", "Unknown");
}
以上差不多就是Function类的使用方法,至于其它用法。就看大家去挖掘了。