Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
List<User> userList = handleUser();
List<User> geUser = new ArrayList<>();
for (User user : userList){
if (user.getAge()>20){
geUser.add(user);}}
1.
2.
3.
4.
5.
6.
7.
上面的handleUser只是一个赋值的操作,代码也放上:
handleUser(){
List<User> userList = new ArrayList<>();
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName("张三");
user.setAge(20);
user.setDept("开发部");
userList.add(user);
User user1 = new User();
user1.setId(UUID.randomUUID().toString());
user1.setName("李四");
user1.setAge(22);
user1.setDept("测试部");
userList.add(user1);
User user2 = new User();
user2.setId(UUID.randomUUID().toString());
user2.setName("王五");
user2.setAge(27);
user2.setDept("财务部");
userList.add(user2);
return userList;}
从这里我们来看 Stream 的循环,循环 for ,JDK7 和 JDK8 的循环的本质,并没啥变化,变化的只是开发者写的代码。我们直接来对比一下写法上的区别。
JDK7中的for循环
for (User user : collect){
System.out.println("年龄大于20的人是:"+user.getName());}
JDK8的for循环
collect.stream().forEach(vo->{
System.out.println("年龄大于20的人是:"+vo.getName());});
//JDK7 获取List<String> 中字符串最长的那个
String[] strArr = new String[]{"cd","ab","ddfa","sd","zd"};
List<String> list = Arrays.asList(strArr);
String max = Collections.max(list, new Comparator<String>(){
@Override
public int compare(String o1, String o2){
if (o1.length()< o2.length()){
return -1;}
if (o1.length()== o2.length()){
return o1.compareTo(o2);} else {
return 1;}}});
System.out.println(max);
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
那么如果使用Stream 来获取呢?
JDK8获取List<String>中最长的字符串
String[] strArr = new String[]{"cd","ab","ddfa","sd","zd"};
List<String> list = Arrays.asList(strArr);
Optional<String> max = list.stream().max(Comparator.comparing(String::length));
System.out.println(max.get());