【问题标题】:One-liner to initialize list from another list单线从另一个列表初始化列表
【发布时间】:2019-07-02 18:30:42
【问题描述】:

我想以最短的方式初始化我的 D 列表。现在我正在使用:

public List<SomeItemDto> itemsToDto(List<SomeItem> items) {
    List<SomeItemDto> itemsDto = new ArrayList<SomeItemDto>();
    for (SomeItem item : items) {
        itemsDto.add(itemToDto(item));
    }
    return itemsDto;
}

有没有办法让它变成单线?

【问题讨论】:

  • 使用流 API。
  • 有理由不简单地使用List.addAll 吗?
  • @S.L.Barth 对象的转换。

标签: java arraylist java-8 initialization java-stream


【解决方案1】:

您可以使用stream 和进一步的mapping 来做到这一点:

return items.stream()
            .map(item -> itemToDto(item)) // map SomeItem to SomeItemDto
            .collect(Collectors.toList());

【讨论】:

  • map(this::itemToDto) 会更短
  • @ernest_k 同意,只是将其保留为 lambda,因为在某种程度上可以使用它轻松传达映射(恕我直言)。
【解决方案2】:

您可以使用map,它基本上将函数应用于元素

List<SomeItemDto> itemsDto = items.stream().map(item -> itemToDto(item))
                                  .collect(Collectors.toList())

【讨论】:

    【解决方案3】:

    如果您愿意使用第三方库,您可以将Eclipse Collections 中的ListIterate 实用程序与任何List 一起使用。

    List<SomeItemDto> itemsDto = ListIterate.collect(items, this::itemToDto);
    

    如果 items 是来自 Eclipse Collections 的 MutableList,您可以直接在列表中使用 API,如下所示:

    List<SomeItemDto> itemsDto = items.collect(this::itemToDto); 
    

    注意:我是 Eclipse Collections 的提交者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2011-08-09
      • 2019-07-30
      • 2012-12-31
      相关资源
      最近更新 更多