如何使用peek或anyMatch返回对象而不是流

时间:2016-11-15 20:26:43

标签: java lambda

我有这段代码:

boolean anyMatch = ifxStopChkInqRs.getBankSvcRs().stream().anyMatch(
  b -> b.getStopChkInqRs().stream().anyMatch(
    i -> i.getStopChkRec().stream()
      .filter(d -> d.getStopChkInfo().getDesc().equals("D"))
      .findFirst()
      .isPresent()));

这会正确返回true / false值,并在找到的第一个对象处退出(如果有)。

但是,我怎样才能返回对象本身,在本例中是StopChkRec类型的i对象?我将anyMatch更改为peek并在get()前面添加了findFirst(),但是返回了最高级别的流 - Stream<BankSvcRs> - 当然是整个搜索目的。

欢迎任何帮助和/或重新构建这个lambda表达式的方法。

2 个答案:

答案 0 :(得分:1)

这样的东西? (另)

ifxStopChkInqRs.getBankSvcRs().stream().flatMap(b -> b.getStopChkInqRs())
  .filter(i -> i != null)
  .flatMap(i -> i.getStopChkRec())
    .filter(d -> (d != null && d.getStopChkInfo().getDesc().equals("D")))
    .findFirst()

我不知道你需要在哪里过滤掉空值,如果你可以使用findAny()而不是findFirst()

答案 1 :(得分:0)

这是:

    Optional<StopChkRecType> findFirst = ifxStopChkInqRs.getBankSvcRs()
        .stream()
        .flatMap(b -> b.getStopChkInqRs().stream())
        .flatMap(i -> i.getStopChkRec().stream())
        .filter(d -> d.getStopChkInfo().getDesc().equals("D"))
        .findFirst();

答案受到@ykaganovich的启发,他使用flatMap让我走上了正确的轨道,同时也在this链接,这解释了如何深入清理干净。

相关问题