首页 > 解决方案 > 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 类列表:

  1. 确保列表中 A 的所有对象的状态的字段状态值为“SUCCESS”,如果不是,则不要执行步骤 2 并结束该过程
  2. 当字段 a 的值为“test99”时,获取字段 b 的值(这在列表中是唯一的)

是否可以使用流来做到这一点?

标签: java-8

解决方案


是的,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
)

它执行以下操作:

  1. 从中获取流list
  2. 将流中的每个转换List为 aStream并从包含所有元素的所有流中生成一个流
  3. status只获取不是的元素SUCCESS
  4. 使用状态不是的元素获取 OptionalSUCCESS
  5. System.out.println(o+" is not successfull")如果存在这样的元素,则执行(()->{}如果您不想在这种情况下执行任何操作,则可以使用)或
  6. 仅获取 a 所在的元素test99
  7. 获取b这些元素的值
  8. 运行一个方法(在这种情况下doSomething()),将值b作为参数(collect()如果你想获取这些元素,你可以使用List

推荐阅读