java8过滤遍历_如何使用Java 8流和过滤器过滤嵌套循环?

本文探讨如何使用Java 8的流和过滤器操作处理嵌套循环,例如过滤汽车列表中的空引擎和引擎中的空部件。通过实例展示了如何在多个层次结构上应用过滤,以保持原始列表结构的完整性。
摘要由CSDN通过智能技术生成

如何使用java8流和过滤器过滤嵌套循环?

假设我有一个汽车列表(List< Car>),每辆汽车都有一个Engines列表(List< Engine>),每个引擎都有一个List< Parts>.

在常规Java中,这种结构可以描述为:

for(Car car : cars) {

for (Engine engine : car.getEngines()) {

for (Part part : engine.getParts()) {

// ...

}

}

}

假设我将汽车列表初始化为:

List cars = new ArrayList(Arrays.asList(new Car(), new Car(), new Car()));

cars.get(0).setEngines(null);

cars.get(1).setEngines(new ArrayList());

cars.get(2).setEngines(new ArrayList() {{

add(new Engine());

add(null);

add(new Engine());

}});

如果我想过滤掉List< Engine>的空值,那么我会这样做

cars.stream().filter(p -> p.getEngines() != null).forEach(System.out::println);

如果我想过滤掉List的空arraylists,那么我会这样做

cars.stream().filter(p -> !p.getEngines().isEmpty()).forEach(System.out::println);

但是如何在第3辆汽车中移除空引擎并保持其他两个引擎连接到原始列表结构?换句话说,我们可以使用Java 8过滤器进入第2级,第3级,第n级层次结构,还是仅在最顶层使用过滤器?我也尝试使用.anyMatch(),没有太多运气.

为了进一步澄清,请考虑以下示例:

我车库里有3辆车.每辆车有3个发动机占位符.每个引擎都有3个占位符,用于构成引擎的部件:

Car #1:

Engine#1: part1, part2, part3

Engine#2: null, part2, empty

Engine#3: part1, null, part3

Car #2:

Engine#1: part1, part2, part3

empty: null, null, null

null: null, null, null

Car #3:

Engine#1: null, empty, part3

Engine#2: null, part2, empty

Engine#3: part1, null, part3

问题:我们如何使用Java 8 .filter,这样在过滤后我得到以下内容:

Car #1:

Engine#1: part1, part2, part3

Engine#2: part2,

Engine#3: part1, part3

Car #2:

Engine#1: part1, part2, part3

Car #1:

Engine#1: part3

Engine#2: part2,

Engine#3: part1,part3

=======================

另一个例子

伙计们,我希望我刚刚编写的这个例子更清楚:基本上它与上面相同只是它更冗长而不是汽车我们可以想到银行来减少抽象.为了简明起见,我将所有领域公之于众,我希望你不要介意.

假设我与我的“银行钱包”中的4家银行有关联

银行#1:

??我在这里实际存钱.我被迫有3个帐户,但只有2个充满了一些现金而第3个尚未开启(即空)

银行#2:

??我打算在这里开银行.创建帐户支持结构(空ArrayList),但不添加任何帐户

银行#3:

?我填写了一些营销表格.他们让我在他们的CRM中,但不会打开任何帐户

银行#4:

?这家银行烧毁了,钱包里有一个神器占位符,它是空的.

以下代码描述了这一点:

public class Bank_Wallet {

public static void main(String[] args) {

List banks = new ArrayList(Arrays.asList(new Bank(), new Bank(), new Bank(), null));

// 1st bank with physical accounts, but one of them is null

banks.get(0).accounts = Arrays.asList(new Account(), null, new Account());

// 2nd bank with empty accounts

banks.get(1).accounts = new ArrayList();

System.out.println("RAW original");

banks.stream().forEach(System.out::println);

System.out.println("

Filtered result... ");

banks.stream()// get stream

.filter(p -> p != null) // get rid of null banks

.filter(p -> p.accounts != null) // get rid of null accounts

.filter(p -> !p.accounts.isEmpty()) // get rid of empty accounts

// .filter(p->p.accounts. ?????? ??) ?? how do I remove null account from the remaining bank entry?

.forEach(System.out::println);

}// main

}

支持类在这里:

public class Bank {

public String name;

public static int counter = 0;

public List accounts;

public Bank() {

this.name = "Bank: #" + Bank.counter++;

}

@Override

public String toString() {

return "Bank [name=" + this.name + ", accounts=" + this.accounts + "]";

}

public class Account {

public String name;

public static int counter;

public Account() {

this.name = "Account: " + Account.counter++;

}

@Override

public String toString() {

return "Account [name=" + this.name + "]";

}

}

当你运行这段代码时,你会发现在建议过滤后,我剩下的就是

Bank [name=Bank: #0, accounts=[Account [name=Account: 0], null, Account [name=Account: 1]]]

题:

我需要做什么其他过滤器添加到代码中以使上述结果在帐户中不显示null并保留整体结构(Bank-> Account-> etc-> etc)

Bank [name=Bank: #0, accounts=[Account [name=Account: 0], Account [name=Account: 1]]]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值