我有一个 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/