现在项目升级用 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
xyooyx 2019 年 2 月 11 日 via iPhone
.forEach(()->{})套两层
|
2
arrow8899 2019 年 2 月 11 日
familyList.forEach(fml -> fml.getPerson().forEach(person -> System.out.println(person.getAge())));
|
3
no1xsyzy 2019 年 2 月 11 日
flatMap
|
4
reeco 2019 年 2 月 11 日 familyList.stream().map(Family::getPerson).flatMap(List::stream).map(Person::getAge).forEach(System.out::println);
|
5
thetydead 2019 年 2 月 11 日
familyList.forEach(f -> f.getPerson().forEach(System.out::println));
|
6
xhinliang 2019 年 2 月 11 日
flatMap 正解
|
7
zts1993 2019 年 2 月 11 日
我觉得用 forEach 都不好意思说自己用的是 Lambda,这和 forr 有啥区别嘛 : )
|
8
LastingTime 2019 年 2 月 11 日
过分追求 Lambda 去简化本不需要简化的代码, 不见得有什么好处.
另外你这几层都得判空, 更没必要了.. |
9
DsuineGP 2019 年 2 月 11 日
flightInfos.stream().map(Family::getPerson).flatMap(Collection::stream).map(Person::getAge).forEach(System.out::println);
|
10
qiyuey 2019 年 2 月 11 日
楼上很多使用了 stream,但是 stream 比较消耗性能,单纯的 forEach 没必要使用 stream。
|
11
SuperHzw OP @DsuineGP 之前研究了一下就是用你这样子的形式,但是这样子判断为空就没了,想加入 optional,但是这样就不知道要怎么写了😂
|
13
SuperHzw OP |
15
nl101531 2019 年 2 月 12 日
@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)); |
17
daemonk 2019 年 2 月 12 日
isEmpty() 还是有可能 NPE 啊
|
19
jorneyr 2019 年 2 月 12 日
2 个 for 循环比啥都简洁的代码,强用其他写法后代码的可读性降低了很多。
|
22
SuperHzw OP |
23
qiyuey 2019 年 2 月 12 日
@SuperHzw 你可以多测试几次,另外建议将 print 操作替换为空的方法调用,因为 print 带来的误差还是比较大的。其实这个问题很简单,你可以看一下 stream 的源码,就会发现,无论如何 stream 的性能不可能超过单纯的循环。
|
24
dengtongcai 2019 年 2 月 12 日
写嵌套,然后 alt+enter 让 idea 帮你改成 lambda
|
25
cyspy 2019 年 2 月 12 日
这两次判空完全是不需要的
|