gpt4 book ai didi

java - 标准化 java 中列表值的转换

转载 作者:行者123 更新时间:2023-11-29 04:48:51 26 4
gpt4 key购买 nike

我有一个 List<Node>我需要转换为不同模型的 JCR 节点。目前,每个模型都有一个单独的功能:

public List<MetaModel> castNodesToMetaModel(List<Node> nodes) {
List<MetaModel> models = new ArrayList<MetaModel>();
for (Node node : nodes) {
models.add(new MetaModel(node, this));
}
return models;
}
protected List<ArticleModel> castNodesToArticleModel(List<Node> nodes) {
List<ArticleModel> models = new ArrayList<ArticleModel>();
for (Node node : nodes) {
models.add(new ArticleModel(node, this));
}
return models;
}

有没有一种方法可以使用 T 来标准化这个转换?类型?

protected <T> List<T> castNodes(T className, List<Node> nodes) {
ArrayList<T> list = new ArrayList<T>();

for (Node node : nodes) {
list.add(new T(node, this)); // Cannot do: new T()
}

return list;
}

最佳答案

使用 Java 8 方法:

public static <T> List<T> mapNodes(List<Node> nodes, Function<Node, T> mapFunction) {
return nodes.stream().map(mapFunction).collect(Collectors.toList());
}

这样调用它:

List<MetaModel> metaModels = mapNodes(nodeList, node -> new MetaModel(node, this));

List<ArticleModel> articleModels = mapNodes(nodeList, node -> new ArticleModel(node, this));

**** 编辑 ****

如果您坚持使用 Java 7,我会建议您使用一种很好的面向对象方法而不是反射。比如这样:

public static <T> List<T> convertNodes(List<Node> nodes, NodeConverter<T> converter) {
ArrayList<T> newNodes = new ArrayList<>();
for (Node node : nodes) {
newNodes.add(converter.convert(node));
}
return newNodes;
}

private static interface NodeConverter<T> {

public T convert(Node node);
}
public static class NodeConverterFactory {

public static final NodeConverter<MetaModel> metaModel(final Object thiz) {
return new NodeConverter<MetaModel>() {
@Override
public MetaModel convert(Node node) {
return new MetaModel(node, thiz);
}
};
}
public static final NodeConverter<ArticleModel> articleModel(final Object thiz) {
return new NodeConverter<ArticleModel>() {
@Override
public ArticleModel convert(Node node) {
return new ArticleModel(node, thiz);
}
};
}
}

然后你像这样使用:

List<MetaModel> metaModels = convertNodes(nodeList, NodeConverterFactory.metaModel(this));

List<ArticleModel> articleModels = convertNodes(nodeList, NodeConverterFactory.articleModel(this));

虽然比反射方法更冗长,但更清晰、更灵活(因为您可以实现所有类型的转换器,而不是局限于一种构造函数)并且类型安全。如果使用的构造函数/方法不存在,反射方法可能会导致运行时问题。

关于java - 标准化 java 中列表值的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185829/

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