其他
提高开发效率和优雅度,java8流式语法,真的可以有
很多面试官喜欢问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);
输出结果
目录:我把精华文章都整理出来了 (目录列的比较全)
帮公司面试1万到1.5万薪资的Java程序员,来看看我问什么