史上最全面讲解Java流对象Stream
目录Lambda表达式Stream API总结Java8可以说是Java路线图中一个里程碑的版本,虽然自Oracle收购Java后,Java的版本演进非常快,目前Java的版本已经到15了,但是目前绝大数的公司都还用着Java7和Java8,使用Java8的公司里面又有很多没有使用Java8的新特性,原因可能是没必要用或者可能是使用的Spring版本太低如果使用新特性会导致Spring启动有问题等
目录
Java8可以说是Java路线图中一个里程碑的版本,虽然自Oracle收购Java后,Java的版本演进非常快,目前Java的版本已经到15了,但是目前绝大数的公司都还用着Java7和Java8,使用Java8的公司里面又有很多没有使用Java8的新特性,原因可能是没必要用或者可能是使用的Spring版本太低如果使用新特性会导致Spring启动有问题等等。
因此今天想给大家介绍Java8的新特性,此时可能会有人说为什么要使用Java8的新特性,这些新特性感觉并没有用。是的,就比如Lambda表达式确实没有给我们带来新的类似于数据结构或者新的功能的东西,这种东西只是从别的函数式编程语言借鉴而来的一种编程方式,我们要学习它,可能会花费不少的学习成本。但是,如果你想去学习java.util.stream,你就必须先了解Lambda表达式,没有这个基础,你想理解Stream会非常吃力。有人会说为什么要学习Stream呢,Java已经给我们提供了很多遍历的迭代器、排序方式(Comparator)等。Stream确实主要的功能也是进行遍历、排序、过滤、统计计算等,它的好处是代码更简洁高效,能够通过链式语法一步把上述功能都做好,另外它还支持并行处理。
Lambda表达式
耳听为虚,眼见为实。希望大家先学以致用,再才能深刻体会到新的东西的优点。在学习Stream之前,先讲解下Lambda表达式的语法。网上有些文章讲的时候会说Lambda表达式有很多种写法,让人眼花缭乱,我这里将它的语法归纳为一种,方便大家记忆。
参数 执行语句
(params) -> {codes}
以后写Lambda表达式就按照这个规范来写,可以应对所有的情况。有的同学会问为什么有的没有“()”,有的没有“{}”,如果你的参数只有一个就可以不要“()”,你的代码只有一行就可以不要“{}”。现在是不是能完全想明白了。看看下面的例子秒懂。
public static void main(String[] args) {
AddService addService = (a, b) -> a + b;
System.out.println("1+2="+addService.add(1,2));
PrintService printService = abc -> System.out.println(abc);
printService.say("hello,world");
}
interface AddService{
int add(int a, int b);
}
interface PrintService{
void say(String msg);
}
}
Stream API
接下来讲下Stream,首先看看下面这个流程
stream -> [filter] + [sorted] + [map] -> collect
从流开始,经过过滤、排序、映射加工后再进行搜集成一个对象集合。对流的操作主要是过滤、排序和映射这三种操作,下面将着重讲解这三种操作。
首先构建一个数据集
List<Student> list = new ArrayList<>();
Student student = new Student("lily", 23);
list.add(student);
student = new Student("jim", 20);
list.add(student);
student=new Student("bob", 19);
list.add(student);
1.forEach
list.stream().forEach((s) -> {
System.out.println(String.format("%s,%s", s.getName(), String.valueOf(s.getAge())));
});
2.sorted
List<Student> sortedList = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
sortedList.stream().forEach((s) -> {
System.out.println(String.format("%s,%s", s.getName(),
String.valueOf(s.getAge())));
});
3.filter
List<Student> filterList = list.stream().filter(s ->
s.getAge()>=20).collect(Collectors.toList());
filterList.stream().forEach((s) -> {
System.out.println(String.format("%s,%s", s.getName(),
String.valueOf(s.getAge())));
});
4.map
Stream.of("mick,25","wood,30").map(new Function<String, Student>() {
public Student apply(String s){
String[] array = s.split(",");
Student student1 = new Student(array[0], Integer.parseInt(array[1]));
return student1;
}
}).forEach(student1 -> System.out.println(student1.getName()+":"+student1.getAge()));
5.parallelSteam
list.parallelStream().forEach(s->{s.setAge(s.getAge()+1);logger.info("{},{}", s.getName(), s.getAge());});
并行处理的结果:
14:20:43.293 [ForkJoinPool.commonPool-worker-2] INFO com.lambda.StreamTest - bob,20
14:20:43.293 [ForkJoinPool.commonPool-worker-1] INFO com.lambda.StreamTest - lily,24
14:20:43.293 [main] INFO com.lambda.StreamTest - jim,21
可以看到两个工作线程和一个主线程同时完成了加1并输出的工作。
总结
从lambda到Stream,由简到难,每个定义每个例子,从抽象到具体层层抽丝剥茧,相信大家在1024这个全球程序员的节日收获满满。正如现在网上流传的打工人的段子,打工不一定能赚很多钱,但不打工肯定赚不到很多钱,这就是现实。
更多推荐
所有评论(0)