现在项目升级用 jdk8,使用的时候遇到了一个问题,请教一下大家
实体类: Family{ private List<Person> person; ... } Person{ private String age; ... }
现在我要输出每个家庭中的每个人的年龄 jdk8 之前的写法:
f(!familyList.isEmpty()){ for(Family f : familyList){ if(!f.getPerson.isEmpty()){ for(Person p : f.getPerson){ system.out.println(p.getAge()); } } } }
感觉很繁琐,可以用 Lambda 表达式来简化代码吗?
![]() | 1 xyooyx 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 ![]() 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 这两次判空完全是不需要的 |