Google Guava:函数编程

[b]Google Guava:函数式编程[/b]

在guava中存在一个com.google.common.base.Functions和com.google.common.base.Function类,利用他们,可以为集合类的转换提供自定义的转换函数。

首先我们看第一个例子,简单的自定义一个函数,然后用于一个简单的list对象的转换,代码如下:

初始化的代码:
static class School {
public String name;
public String location;

public static School newSchool(String name,String loc) {
School s = new School();
s.name = name;
s.location = loc;
return s;
}
}
List<School> schools;

@Before
public void init() {
schools = Lists.newLinkedList();
schools.addAll(Arrays.asList(School.newSchool("xigongda", "xi'an"),
School.newSchool("xijiaoda", "chengdu")));
}
@After
public void end() {
if(schools!=null) {
schools.clear();
}
}

下面开始第一个测试,我们将定义一个功能函数,然后在集合转换的时候使用它,最后测试结果,如下:
    @Test
public void testFunctions1() {
//测试一个功能函数,用于集合转换
//1、定义一个功能函数,用于将School类转为地址字符串
Function<School,String> f = new Function<School,String>() {
@Override
public String apply(School s) {
if(s==null) {
return "";
}
return s.location;
}

};

//2、开始转换集合
Collection<String> locationList = Collections2.transform(schools, f);

//3、验证结果含有期望的值
assertThat(locationList, hasItems("xi'an","chengdu"));
}

这个比较简单,但是可能有些情况需要将不同的函数组合起来,进行合并运算,比如先执行一个转换,然后再执行一个大小写的转换,这个情况guava也是支持的,代码如下:
@Test
public void testFunctions2() {
//测试组合两个功能函数,用于集合转换
//1、定义第一个功能函数,用于将School类转为地址字符串,即:f(school)=location
Function<School,String> f = new Function<School,String>() {
@Override
public String apply(School s) {
if(s==null) {
return "";
}
return s.location;
}

};
//2、定义第二个功能函数,用于转换大小写,即:f(string)=STRING
Function<String,String> f2 = new Function<String,String>() {
@Override
public String apply(String s) {
if(s==null) {
return "";
}
return s.toUpperCase();
}
};

//3、定义函数组合,将对每个元素执行f,然后对结果进行f2计算,即:result=f2(f(school))
Function<School,String> f3 = Functions.compose(f2, f);

//4、开始转换集合
Collection<String> locationList = Collections2.transform(schools, f3);

//5、验证结果含有期望的值
assertThat(locationList, hasItems("XI'AN","CHENGDU"));
}

最后,guava还支持预定义的基于map的映射函数,即给他一个Map,他会按照Map的key/value定义,将集合的元素逐个和key匹配,如果发现匹配的,则返回value,代码如下:
    @Test
public void testForMap() {
//测试对map的预定义函数,即使用forMap构造的函数,在集合转换的时候会被自动映射
//1、定义映射表
Map<School,String> m = Maps.newHashMap();
m.put(schools.get(0), "hangtian");
//m.put(schools.get(1), "tielu");

//2、定义函数
Function<School,String> f = Functions.forMap(m,"UNKNOWN");

//3、转换,此时会对schools中的每个元素调用映射进行转换,得到学校属性
Collection<String> types = Collections2.transform(schools, f);

//4、验证
assertThat(types, hasItems("hangtian","UNKNOWN"));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值