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