gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:24 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com