如何使用java中的函数编程将这两个方法合并在一起

时间:2016-12-16 01:54:03

标签: java functional-programming

我需要使用函数式编程将这两个方法合并在一起,但我不熟悉它,无论如何都要这样做吗?

private String getCsvHeader(Object obj) {
    Field[] fields = obj.getClass().getFields();
    StringBuilder sb = new StringBuilder();
    String prefix = "";

    for (Field field : fields) {
        sb.append(prefix).append(field.getName());
        prefix = ",";
    }
    return sb.toString();
}

private String getCsvString(Object obj) throws IllegalAccessException {

    Field[] fields = obj.getClass().getFields();
    StringBuilder sb = new StringBuilder();

    String prefix = "";
    for (Field field : fields) {
        sb.append(prefix).append(field.get(obj));
        prefix = ",";
    }
    return sb.toString();
}

2 个答案:

答案 0 :(得分:0)

像Pary Wombat说的那样,就像那样:

private String getCsv(Object obj, boolean isHeader) throws IllegalAccessException
    {
        Field[] fields = obj.getClass().getFields();
        StringBuilder sb = new StringBuilder();

        String prefix = "";
        for (Field field : fields)
        {
            if (isHeader)
            {
                sb.append(prefix).append(field.getName());
            }
            else
            {
                sb.append(prefix).append(field.get(obj));
            }
            prefix = ",";
        }
        return sb.toString();
    }

答案 1 :(得分:0)

这个聚会真的晚了,但另一种可能的选择是创建一个方法,例如,getFieldString 接受一个 Function 函数接口,如下所示,从而抽象函数之外的行为并保持它通用。

private String getFieldString(Object obj, Function f){
    Field[] fields = obj.getClass().getFields();
    StringBuilder sb = new StringBuilder();

    String prefix = "";
    for (Field field : fields) {
        sb.append(prefix).append(f.apply(field));
        prefix = ",";
    }
    return sb.toString();
}

然后我们可以在调用期间提供行为。

Function<Field, String> f1 = (field) -> field.getName();
Function<Field, Object> f2 = (field) -> field.get(obj);

fc.getFieldString(obj, f1);
fc.getFieldString(obj, f2);

通过这种方式,方法 getFieldString 可以合理地避免在将来出现新需求时需要修改。