我有这段代码:
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表达式的方法。
答案 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链接,这解释了如何深入清理干净。