Guava functional -- Function

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类的使用方法,至于其它用法。就看大家去挖掘了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值