java-8 - java 8 流和 foreach 的特定用例
问题描述
有A类:
class A{
private String a;
private String b;
private String status;
/*
. getter & setter
*/
}
我有一个B类:
class B{
private List<List<A>> list;
}
我必须编写一个逻辑来遍历 B 类中的 A 类列表:
- 确保列表中 A 的所有对象的状态的字段状态值为“SUCCESS”,如果不是,则不要执行步骤 2 并结束该过程
- 当字段 a 的值为“test99”时,获取字段 b 的值(这在列表中是唯一的)
是否可以使用流来做到这一点?
解决方案
是的,Java 8 Streams 是可能的,但我会使用的不仅仅是forEach()
:
list.stream()//1
.flatMap(List::stream)//2
.filter(obj->!"SUCCESS".equals(obj.getStatus()))//3
.findAny()//4
.ifPresentOrElse(o->System.out.println(o+" is not successfull"),()->//5
list.stream()//1
.flatMap(List::stream)//2
.filter(obj->"test99".equals(obj.getA()))//6
.map(obj->obj.getB())//7
.forEach(this::doSomething);//8
)
它执行以下操作:
- 从中获取流
list
- 将流中的每个转换
List
为 aStream
并从包含所有元素的所有流中生成一个流 status
只获取不是的元素SUCCESS
- 使用状态不是的元素获取 Optional
SUCCESS
System.out.println(o+" is not successfull")
如果存在这样的元素,则执行(()->{}
如果您不想在这种情况下执行任何操作,则可以使用)或- 仅获取 a 所在的元素
test99
- 获取
b
这些元素的值 - 运行一个方法(在这种情况下
doSomething()
),将值b
作为参数(collect()
如果你想获取这些元素,你可以使用List
推荐阅读
- c++ - 如何在函数中增加 x 的值?
- drools - kContainer.newKieSession 在 drools 7.37 版本中返回 NULL
- vue.js - 如何在 NuxtJS 中设置全局 $axios 标头
- java - 如何从透明的 java swing table 中删除边距/边框
- sql - 我正在尝试通过 sql 访问雪花中的以下数据,但在列中获取 NULL。请调查一下
- excel - 选择并突出显示包含特定文本的数据透视表中的行
- dns - 使用 Google 计算实例设置 DNS 记录
- python - 如何在 django python 中获取 URL 的一部分并转换为字符串?
- c++ - 派生类看不到基类成员
- excel - 分配命令按钮以上传工作簿