java - 按给定顺序从 pojo 填充列表

标签 java oop design-patterns java-8

我有一个 POJO 对象,它有几个字段和一个字符串列表。我们必须使用 pojo 的字段值创建一个对象列表,其顺序与字符串列表完全相同。现在我在 String 列表上循环时用 pojo getter 调用 list.add-

public class ResultSet {
    private String field1;
    private String field2;
    private String field3;
    private String field4;


    public List<Object> populateResultList(List<String> list) {
        List<Object> resultSet = new ArrayList<>();
        for (String filedName : list) {
            if ("Field1".equalsIgnoreCase(filedName)) {
                resultSet.add(getField1());
            } else if ("Field2".equalsIgnoreCase(filedName)) {
                resultSet.add(getField2());
            } else if ("Field3".equalsIgnoreCase(filedName)) {
                resultSet.add(getField3());
            } else if ("Field4".equalsIgnoreCase(filedName)) {
                resultSet.add(getField4());
            }
        }
        return resultSet;
    }


    public String getField1() {
        return field1;
    }

    public String getField2() {
        return field2;
    }

    public String getField3() {
        return field3;
    }

    public String getField4() {
        return field4;
    }
}

有没有更好的方法来实现它,因为它有很多样板代码。

最佳答案

您可以使用普通的 Java 8 Stream API 来实现。您可以定义 fieldName 之间的映射字符串和 Function<ResultSet, Object>返回与 fieldName 关联的值.使用函数的优点是可以将其简化为 method reference喜欢ResultSet::getField1等同于以下 lambda 表达式:

Function<ResultSet, Object> f = resultSet -> resultSet.getField1();

通过这种方式,您可以像这样定义映射:

private static final Map<String, Function<ResultSet, Object>> mappings = new HashMap<String, Function<ResultSet, Object>>() {{
    put("field1", ResultSet::getField1);
    put("field2", ResultSet::getField2);
    put("field3", ResultSet::getField3);
    put("field4", ResultSet::getField4);
}};

然后是你的populateResultList方法可能如下所示:

public List<Object> populateResultList(List<String> list) {
    return list.stream()
            .map(fieldName -> mappings.getOrDefault(fieldName.toLowerCase(), it -> null).apply(this))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
}

这里发生的是每个 fieldName输入 List<String>我们采用 mappings 中定义的映射器map 或者我们返回一个类似 it -> null 的映射器如果给定 fieldName 的映射器没有定义。打电话.filter(Objects::nonNull)从结果列表中过滤掉所有空元素。

演示

在这里你可以找到 Demo

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;

final class ResultSet {
    private String field1;
    private String field2;
    private String field3;
    private String field4;

    public ResultSet(String field1, String field2, String field3, String field4) {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;
        this.field4 = field4;
    }

    private static final Map<String, Function<ResultSet, Object>> mappings = new HashMap<String, Function<ResultSet, Object>>() {{
        put("field1", ResultSet::getField1);
        put("field2", ResultSet::getField2);
        put("field3", ResultSet::getField3);
        put("field4", ResultSet::getField4);
    }};

    public List<Object> populateResultList(List<String> list) {
        return list.stream()
                .map(fieldName -> mappings.getOrDefault(fieldName.toLowerCase(), it -> null).apply(this))
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
    }

    public String getField1() {
        return field1;
    }

    public String getField2() {
        return field2;
    }

    public String getField3() {
        return field3;
    }

    public String getField4() {
        return field4;
    }

    public static void main(String[] args) {
        ResultSet resultSet = new ResultSet("lorem", "ipsum", "dolor", "sit amet");

        System.out.println(resultSet.populateResultList(Arrays.asList("Field1", "Field4", "Field3", "Field2", "Field9")));
    }
}

希望对你有帮助。

关于java - 按给定顺序从 pojo 填充列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45905481/

相关文章:

java - Mozilla Rhino 如何使用 nodejs "fs"模块?

java - 获取差异。 azure 托管代理上的 chrome 驱动程序出现错误

c++ - "Expression must have class type"使用未记录的库函数

c++ - 如果 C 有结构,为什么它不是 OOP

c++ - "is-implemented-in-terms-of"是什么关系,我应该什么时候使用它?

java - Spring Data Rest 2.0.0.RELEASE 打破了以前使用 RC1 的代码

java - 在java中使用正则表达式

c++ - 如何只允许对像对象这样的整数有效值并对其进行迭代?

java - 将表示 XML 的 Java 对象序列化为其 XML 形式是否合适?

c++ - 如何从装饰元素上移除一层?