查看原文
其他

提高开发效率和优雅度,java8流式语法,真的可以有

我是程序汪 我是程序汪 2021-09-08


很多面试官喜欢问java8的新特性有什么

这时候你就可以把函数式编程拉出来讲一讲

开发业务代码lambda语法真的非常爽


下面用几个小例子get一下 


java8

吐槽

程序员为了不天天996加班

学习java8流式语法提高开发效率

很多人吐槽性能低

你想想坐飞机多快,但为什么做高铁的人多了

这就是成本问题

目标

这里不谈底层原理,就把工作中实用的小demo输出

  • java8流式语法

  • map

  • filter

  • Optional

  • findFirst

  • ::方法引用

  • limit

  • skip

上代码案例

创建学生类和文具类,看json关系

每个学生有多套文具

List<Stationery> a=Lists.newArrayList(new Stationery("钢笔","红本"),new Stationery("钢笔","本子"));List<Stationery> b=Lists.newArrayList(new Stationery("圆珠笔","绿本"));List<Stationery> c=Lists.newArrayList(new Stationery("钢笔","蓝子"),new Stationery("铅笔","黄本"));


初始化学生数据

List<Student> students=new ArrayList<>();students.add(new Student("001","程序汪","男", a,18));students.add(new Student("002","小红","女", b,11));students.add(new Student("003","小美","女", c,10));


Optional防空利器

说白了把if-else语法的压扁了

//集合防空

Optional.ofNullable(students).orElse(Collections.emptyList()). forEach(System.out::println);


1

Optional+findFirst

集合中找一条数据

Optional<String> oFindFirst=students.stream().filter(Objects::nonNull).map(Student::getName).filter(f->StringUtils.equals(f,"程序汪")).findFirst();


这样判断和if-else没区别

if(oFindFirst.isPresent()){System.out.println("给"+oFindFirst.get()+"发奖金啦");}


那就来个简洁的ifPresent


oFindFirst.ifPresent(f->{System.out.println("给"+f+"发奖金啦");});


1

filter过滤

students.stream().filter(Objects::nonNull).forEach(f->{System.out.println(f.getName());});


map

集合变形

List<String> names=students.stream().filter(Objects::nonNull).map(Student::getName).collect(Collectors.toList());names.forEach(System.out::println);


flatMap扁平化

和map的区别是,map是1对1的,flatMap是1对多

相等有集合list.add 和list.addAll区别

如下把学生集合中文具集合属性,扁平化在输出

对应复杂的集合嵌套类,处理起来非常爽

students.stream().filter(Objects::nonNull).map(Student::getStationerys).flatMap(List::stream).forEach(System.out::println);


list转map

Map<String,Student> map=students.stream().filter(Objects::nonNull).collect(Collectors.toMap(Student::getStudentId,s->s));System.out.println(JSON.toJSON(map));


输出结果

1

list转map分组

Map<String,List<Student>> map2=students.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(stu->stu.getSex()));


1

limit

当集合空是limit返回的是一个空集合不是null

这样不容易NEP

List<String> names2=students.stream().filter(Objects::nonNull).map(Student::getName).filter(f->StringUtils.equals(f,"aaa")).limit(1).collect(Collectors.toList());names2.forEach(System.out::println);


skip

limit+skip类似mysql的limit关键字用法List<String> names33=students.stream().filter(Objects::nonNull).map(Student::getName).skip(2).limit(1).collect(Collectors.toList());names33.forEach(System.out::println);


集合排序

那是相当简洁

Collections.sort(students,Comparator.comparing(Student::getAge));students.forEach(System.out::println);


并行

不能乱用小心线程安全问题,后面有空单独整理下这个并行的

students.parallelStream().forEach(System.out::println);


输出结果




程序汪往期精彩回顾


乐观锁


悲观锁


目录:我把精华文章都整理出来了    (目录列的比较全)


面试造火箭,入职拧螺丝!一个JAVA面试官的心声


程序汪面试题java篇20190801


log4j


帮公司面试1万到1.5万薪资的Java程序员,来看看我问什么


程序员怎么接私活赚钱


程序员搞自媒体赚钱


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存