guava Lists.transform 踩过的坑

本文通过两个具体的案例对比展示了如何使用 Guava 库中的 Lists.transform 方法进行集合转换,并探讨了在转换过程中异常处理的不同策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.case;

import java.util.List;

import com.google.common.base.Function;
import com.google.common.collect.Lists;

/**
 * Step on the pit with guava
 * 
 * @author James
 * @version $Id: GuavaListsTransFormCase.java, v 0.1 2017年3月24日 下午8:36:36 James Exp $
 */
public class GuavaListsTransFormCase {

    public static void main(String[] args) {

        List<A> as = Lists.newArrayList();
        A a = new A();
        a.setC(1);
        as.add(a);

        try {
            System.out.println("case1 start");
            transFormCase1(as);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            System.out.println("case1 end");
        }

        try {
            System.out.println("case2 start");
            transFormCase2(as);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            System.out.println("case2 end");
        }

    }

    private static List<B> transFormCase1(List<A> as) {
        return Lists.transform(as, new Function<A, B>() {
            @Override
            public B apply(A input) {
                B b = new B();
                b.setC(input.getC() / 0);
                //...variables
                return b;
            }
        });
    }

    private static List<B> transFormCase2(List<A> as) {
        return Lists.newArrayList(Lists.transform(as, new Function<A, B>() {
            @Override
            public B apply(A input) {
                B b = new B();
                b.setC(input.getC() / 0);
                //...variables
                return b;
            }
        }));
    }
}

class A {
    private int c;

    //...variables

    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }

}

class B {
    private int c;

    //...variables

    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }
}

执行结果: 

case1 start
case1 end
case2 start
/ by zero
case2 end

case2比case1多了一步,在使用Lists.transform的时候将转换结果,用Lists.newArrayList 重新产生一个新的list。以确保function内的代码(比如调用远程方法,操作数据库等容易抛出异常的代码)立即被执行,而不是在要使用的时候执行,从而导致异常没有在预期的地方被捕获。

转载于:https://my.oschina.net/phridem/blog/866531

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值