现在项目升级用 jdk8,使用的时候遇到了一个问题,请教一下大家
实体类:
Family{
private List<Person> person;
...
}
Person{
private String age;
...
}
现在我要输出每个家庭中的每个人的年龄 jdk8 之前的写法:
if(!familyList.isEmpty()){
for(Family f : familyList){
if(!f.getPerson.isEmpty()){
for(Person p : f.getPerson){
system.out.println(p.getAge());
}
}
}
}
感觉很繁琐,可以用 Lambda 表达式来简化代码吗?
1
lqw3030 2019-02-11 15:41:31 +08:00 via iPhone
.forEach(()->{})套两层
|
2
arrow8899 2019-02-11 15:44:55 +08:00
familyList.forEach(fml -> fml.getPerson().forEach(person -> System.out.println(person.getAge())));
|
3
no1xsyzy 2019-02-11 15:50:44 +08:00
flatMap
|
4
reeco 2019-02-11 16:01:54 +08:00 4
familyList.stream().map(Family::getPerson).flatMap(List::stream).map(Person::getAge).forEach(System.out::println);
|
5
thetydead 2019-02-11 16:02:19 +08:00
familyList.forEach(f -> f.getPerson().forEach(System.out::println));
|
6
xhinliang 2019-02-11 16:02:26 +08:00
flatMap 正解
|
7
zts1993 2019-02-11 16:15:35 +08:00
我觉得用 forEach 都不好意思说自己用的是 Lambda,这和 forr 有啥区别嘛 : )
|
8
LastingTime 2019-02-11 16:49:18 +08:00
过分追求 Lambda 去简化本不需要简化的代码, 不见得有什么好处.
另外你这几层都得判空, 更没必要了.. |
9
DsuineGP 2019-02-11 17:25:57 +08:00
flightInfos.stream().map(Family::getPerson).flatMap(Collection::stream).map(Person::getAge).forEach(System.out::println);
|
10
qiyuey 2019-02-11 19:00:19 +08:00
楼上很多使用了 stream,但是 stream 比较消耗性能,单纯的 forEach 没必要使用 stream。
|
11
SuperHzw OP @DsuineGP 之前研究了一下就是用你这样子的形式,但是这样子判断为空就没了,想加入 optional,但是这样就不知道要怎么写了😂
|
13
SuperHzw OP |
14
wxkvEX 2019-02-12 00:56:07 +08:00 via iPhone
@SuperHzw 为啥要 optional,非空判断可以加 family 的流里,用 filter 就可以
|
15
nl101531 2019-02-12 08:07:56 +08:00
@SuperHzw 你这里只是 isEmpty 判断,实际上集合中没有元素 Stream 这个链路只会构造起来,但是不会执行的,不用考虑。如果是 NPE 判断可以按照下面方式。
Optional.ofNullable(familyList) .orElse(Collections.emptyList()) .stream() .filter(x -> !CollectionUtils.isEmpty(x.person)) .flatMap(x -> x.person.stream()) .forEach(x -> System.out.println(x.age)); |
16
SuperHzw OP @wxkvEX 是的,用 filter 也可以,只是自己好奇在此背景下如何用 stream 和 optional 结合的方式写
|
17
daemonk 2019-02-12 10:20:11 +08:00
isEmpty() 还是有可能 NPE 啊
|
19
jorneyr 2019-02-12 10:34:21 +08:00
2 个 for 循环比啥都简洁的代码,强用其他写法后代码的可读性降低了很多。
|
22
SuperHzw OP |
23
qiyuey 2019-02-12 13:26:09 +08:00
@SuperHzw 你可以多测试几次,另外建议将 print 操作替换为空的方法调用,因为 print 带来的误差还是比较大的。其实这个问题很简单,你可以看一下 stream 的源码,就会发现,无论如何 stream 的性能不可能超过单纯的循环。
|
24
dengtongcai 2019-02-12 14:03:50 +08:00
写嵌套,然后 alt+enter 让 idea 帮你改成 lambda
|
25
cyspy 2019-02-12 16:07:14 +08:00
这两次判空完全是不需要的
|