Guava functional -- Function
发布日期:2021-06-29 12:51:41 浏览次数:2 分类:技术文章

本文共 3777 字,大约阅读时间需要 12 分钟。

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@ToStringpublic 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
users = Lists.newArrayList(user1, user2, user3); Function
nameFunction = new Function
() { @Override public String apply(User input) { if(null == input){ return ""; } return input.getName(); } }; // when Collection
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
users = Lists.newArrayList(user1, user2, user3); Function
nameFunction = new Function
() { @Override public String apply(User input) { if(null == input){ return ""; } return input.getName(); } }; Function
upperCaseFunction = new Function
() { @Override public String apply(String input) { if(null == input){ return ""; } return input.toUpperCase(); } }; Function
composedFunction = Functions.compose(upperCaseFunction, nameFunction); // when Collection
names = Collections2.transform(users, composedFunction); // then assertThat(names).contains("CARL", "KEVIN", "ERIN"); }

3、根据list的Key值,获取Map中对应的value值

@Test    public void shouldUseForMapFunction(){        // given        Map
map = Maps.newHashMap(); map.put("carl", "26"); map.put("kevin", "24"); map.put("erin", "25"); // when Function
nameForAge = Functions.forMap(map); List
names = Lists.newArrayList("carl", "kevin", "erin"); // then Collection
ages = Collections2.transform(names, nameForAge); assertThat(ages).containsOnly("24", "25", "26"); }

4、针对第3种情况,如果key值找不到对应的Value会报错,但是可以给默认值

@Test    public void shouldUseForMapFunctionWithDefaultValue(){        // given        Map
map = Maps.newHashMap(); map.put("carl", "26"); map.put("kevin", "24"); map.put("erin", "25"); // when Function
nameForAge = Functions.forMap(map, "Unknown"); List
names = Lists.newArrayList("carl", "taylor"); // then Collection
ages = Collections2.transform(names, nameForAge); assertThat(ages).containsOnly("26", "Unknown"); }

以上差不多就是Function类的使用方法,至于其它用法。就看大家去挖掘了。

转载地址:https://carlzone.blog.csdn.net/article/details/51713181 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Guava functional -- Predicate
下一篇:Idea 无法引用类问题

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月15日 19时22分39秒