Java - 将对象列表映射到具有其属性属性值的列表

新手上路,请多包涵

我将 ViewValue 类定义如下:

 class ViewValue {

private Long id;
private Integer value;
private String description;
private View view;
private Double defaultFeeRate;

// getters and setters for all properties
}

在我的代码中的某处,我需要将 ViewValue 实例列表转换为包含来自相应 ViewValue 的 id 字段值的列表。

我使用 foreach 循环来做到这一点:

 List<Long> toIdsList(List<ViewValue> viewValues) {

   List<Long> ids = new ArrayList<Long>();

   for (ViewValue viewValue : viewValues) {
      ids.add(viewValue.getId());
   }

   return ids;

}

有没有更好的方法来解决这个问题?

原文由 mgamer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 403
2 个回答

编辑:这个答案是基于这样的想法,即您需要对代码中其他地方的不同实体和不同属性执行类似的操作。如果您 只需 要按 ID 将 ViewValues 列表转换为 Longs 列表,请坚持使用原始代码。但是,如果您想要一个更可重用的解决方案,请继续阅读……

我会为投影声明一个接口,例如

public interface Function<Arg,Result>
{
    public Result apply(Arg arg);
}

然后你可以写一个单一的通用转换方法:

 public <Source, Result> List<Result> convertAll(List<Source> source,
    Function<Source, Result> projection)
{
    ArrayList<Result> results = new ArrayList<Result>();
    for (Source element : source)
    {
         results.add(projection.apply(element));
    }
    return results;
}

然后你可以像这样定义简单的投影:

 private static final Function<ViewValue, Long> ID_PROJECTION =
    new Function<ViewValue, Long>()
    {
        public Long apply(ViewValue x)
        {
            return x.getId();
        }
    };

并像这样应用它:

 List<Long> ids = convertAll(values, ID_PROJECTION);

(显然,使用 K&R 支撑和更长的行会使投影声明更短 :)

坦率地说,如果使用 lambda 表达式,所有这些都会好很多,但没关系……

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 2.5 许可协议

我们可以使用 java 8 在一行代码中完成

List<Long> ids = viewValues.stream().map(ViewValue::getId).collect(Collectors.toList());

欲了解更多信息: Java 8 - 流

原文由 Radhakrishna Sharma Gorenta 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题