您的位置:首页 > 其它

Guava functional -- Function

2016-06-19 17:29 375 查看
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类的使用方法,至于其它用法。就看大家去挖掘了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: