【问题标题】:How to return just one string from java stream如何从java流中只返回一个字符串
【发布时间】:2018-11-09 08:29:31
【问题描述】:

我了解如何收集到List,但不知道 我如何将过滤对象的一个​​参数作为String 返回。

fee = new BigDecimal(fees
            .stream()
            .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
            .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
            .filter(p -> p.getId().equals(id))

    return fee;

我首先检查费用是否是最新的,因为可能会有即将收取的费用和不再有效的费用。然后我将 id 与剩余费用相匹配。 但是最后一个过滤器和返回之间缺少代码。

我只想为BigDecimal 构造函数从Stream 对象(p.getFee)返回String

我知道过滤后只剩下一个Stream 对象。

【问题讨论】:

  • 如果您希望收集的流中有单个元素或 0 个元素,您应该明确处理这种情况,因为收集中的元素超过 1 个。

标签: java java-8 java-stream


【解决方案1】:

使用findFirst 返回Stream 中通过过滤器的第一个元素。它返回一个Optional,因此您可以使用orElse() 设置默认值,以防Stream 为空。

fee = new BigDecimal(fees
            .stream()
            .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
            .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
            .filter(p -> p.getId().equals(id))
            .map(p -> p.getFee())
            .findFirst()
            .orElse(/*some default value*/));

【讨论】:

  • 或者如果是异常状态,可能会抛出异常。
  • 你碰巧知道为什么 .filter(p -> p.getInstrumentid().equals(id)) 部分无法找到匹配项,即使我查找它并且数据肯定包含具有给定 ID 的费用对象?如果我把最后一个过滤器去掉,其他一切都正常..
  • @Clomez id的类型和getInstrumentId的返回类型是什么?
【解决方案2】:

也许这是一个更好的方法:

fee = fees.stream()
        .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
        .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
        .filter(p -> p.getId().equals(id))
        .map(p -> p.getFee())
        .findFirst()
        .map(BigDecimal::new)
        .orElse(/*some default value*/);

【讨论】:

  • 也可以将第一个map操作改为.map(p -> new BigDecimal(p.getFee()))
  • 但在这种情况下,您可以将 null 传递给“new BigDecimal(null)”
  • 在哪种情况下?当getFee() 返回null 时,您的变体也会以NullPointerException 失败。
  • 我不认为(但不确定),因为如果 p.getFee()==null 那么它会去 orElse
猜你喜欢
  • 2016-10-27
  • 2014-03-12
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2013-03-17
相关资源
最近更新 更多