【问题标题】:pass two parameters using java8 stream().map to call service method使用 java8 stream().map 传递两个参数来调用服务方法
【发布时间】:2018-01-19 07:08:22
【问题描述】:

我有以下服务可以与Java8正常工作

List<ReportCount> getReportDetails(List<String> statusList);

statusList.add(Arrays.asList("SUCCESS"));
statusList.add(Arrays.asList("CANCELLED"));    
statusList.add(Arrays.asList("ON_HOLD","INPROGRESS"));

statusList.stream()
          .map(reportService::getReportDetails)
          .forEach(e -> reportMap.put("report_" + reportMap.size(), e));

如何使用上面的代码为下面的方法再传递 1 个参数。

String id="CA";
List<ReportCount> getReportDetails(List<String> statusList, String id);

有人可以帮忙吗?谢谢

【问题讨论】:

  • 使用 lambda 表达式。除非您的 statusList 确实是列表列表,否则即使第一个参数也不匹配。
  • statusList 有状态列表
  • 然后你想将整个列表,而不是每个元素,传递给 getReportDetails()。你为什么使用原始类型? getReportDetails()的第一个参数是什么类型?
  • statusList 正在通过。上面的代码已经与getReportDetails(List statusList) 一起工作。当我再添加 1 个参数时,无法在地图内部传递,它会抛出错误
  • 除此之外,您不应该使用forEach 将元素放入地图中。请改用collect(Collectors.toMap(...))

标签: java lambda java-8 java-stream


【解决方案1】:

开始使用原始类型:

List<ReportCount> getReportDetails(List<String> statusList, String id);

然后使用 lambda 表达式:

List<List<String>> listOfStatusList = new ArrayList<>();
listOfStatusList.add(Arrays.asList("SUCCESS"));
listOfStatusList.add(Arrays.asList("CANCELLED"));    
listOfStatusList.add(Arrays.asList("ON_HOLD","INPROGRESS"));

String someId = ...;

listOfStatusList.stream()
                .map(statusList -> reportService.getReportDetails(statusList, someId))

【讨论】:

  • 您应该显示someId 的虚拟声明以强调它必须来自某个地方,例如String someId = /*assign value*/;
  • @Andreas 确实如此。完成。
【解决方案2】:

另一种选择是:

1) 映射到 Object 数组,将原始数据添加为条目 0,然后将额外参数添加到其他条目

2) 再次映射,这次使用对象数组中的数据转换回第一次映射中添加的特定类型。

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 2020-09-22
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多