如何从java流中只返回一个字符串

Clo*_*mez 10 java java-8 java-stream

我理解如何收集到一个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;
Run Code Online (Sandbox Code Playgroud)

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

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

我知道Stream过滤器后只剩下一个物体.

Era*_*ran 14

使用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*/));
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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*/);
Run Code Online (Sandbox Code Playgroud)

  • 推荐阅读:[如果 findFirst() 找到的第一个元素为 null,为什么会抛出 NullPointerException?](/sf/ask/2272675961/) (5认同)
  • 您还可以将第一个“map”操作更改为“.map(p -> new BigDecimal(p.getFee()))” (2认同)