【问题标题】:Java 8 Streams Filter a list based on a conditionJava 8 Streams 根据条件过滤列表
【发布时间】:2016-07-19 10:19:22
【问题描述】:

我正在尝试根据某些条件在原始列表之上提取过滤列表。我正在使用 Java 8 的反向移植版本,我不太确定如何执行此操作。我从 ccarReport.getCcarReportWorkflowInstances() 调用中获取 Set。我需要根据条件匹配来迭代和过滤这个集合(我将每个对象中的日期属性与传递的请求日期进行比较。下面是代码

  Set<CcarReportWorkflowInstance> ccarReportWorkflowInstanceSet = ccarReport.getCcarReportWorkflowInstances();
  List<CcarReportWorkflowInstance> ccarReportWorkflowInstances = StreamSupport.stream(ccarReportWorkflowInstanceSet).filter(ccarReportWorkflowInstance -> DateUtils.isSameDay(cobDate, ccarReportWorkflowInstance.getCobDate()));

正在做这项工作的例程

  public List<CcarRepWfInstDTO> fetchReportInstances(Long reportId, Date cobDate) {
    List<CcarRepWfInstDTO> ccarRepWfInstDTOs = null;
    CcarReport ccarReport = validateInstanceSearchParams(reportId, cobDate);
    Set<CcarReportWorkflowInstance> ccarReportWorkflowInstanceSet = ccarReport.getCcarReportWorkflowInstances();
    List<CcarReportWorkflowInstance> ccarReportWorkflowInstances = StreamSupport.stream(ccarReportWorkflowInstanceSet).filter(ccarReportWorkflowInstance -> DateUtils.isSameDay(cobDate, ccarReportWorkflowInstance.getCobDate()));
    ccarRepWfInstDTOs = ccarRepWfInstMapper.ccarRepWfInstsToCcarRepWfInstDTOs(ccarReportWorkflowInstances);
    return ccarRepWfInstDTOs;
}

我在尝试使用流时遇到错误。

【问题讨论】:

    标签: java-8 java-stream


    【解决方案1】:

    假设我理解你想要做什么,你可以用一行替换你的方法体:

    return 
      validateInstanceSearchParams(reportId, cobDate).getCcarReportWorkflowInstances()
                                                     .stream()
                                                     .filter(c -> DateUtils.isSameDay(cobDate, c.getCobDate()))
                                                     .collect(Collectors.toList());
    
    1. 您可以使用stream() 方法从Set 中获取Stream。不需要StreamSupport.stream()
    2. 过滤 Stream 后,您应该将其 collect 输入到输出 List
    3. 我会使用较短的变量和方法名称。你的代码读起来很痛苦。

    【讨论】:

    • 它抛出一个编译时错误,说它不能返回自定义对象,而只能返回 Type
    • @Balaji 你在哪个方法调用上得到这个错误?
    • 我已附上包含错误的图片作为问题的一部分。请看一下
    • @Balaji:简单地写方法名有什么问题?这比创建屏幕截图要省力。
    • @Balaji:嗯,这正是问题所在。您正在混合两种完全不同的 API。 Java 8 的标准收集器无法实现您的自定义收集器接口。当然,不幸的是两者都有相同的简单名称。查看报错信息中包名的开头……
    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多