使用.stream()或.parallelStream()将集合生成流,然后可以对其中的元素进行流式操作,对流的操作中最常用的是filter和map方法,简单写了下,如下:
import java.io.*;
import java.util.stream.Collectors;
import java.util.List;
import java.util.ArrayList;
class test
{
public static void main (String[] args)
{
List<Integer> list = new ArrayList<>();
for(int i = 0; i < 10; i++){
list.add(i);
}
List<Integer> list1 = list.stream().filter(i -> i <= 5).collect(Collectors.toList());
System.out.println(list1);
List<Integer> list2 = list.stream().map(i -> i*i).collect(Collectors.toList());
System.out.println(list2);
}
}
以上代码段的输出结果:
[0, 1, 2, 3, 4, 5]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
filter()和map()的区别:
filter是过滤操作,返回结果为true的数据;而map的作用是将流中的每一个元素T映射为R。
stream其他常用方法:
方法 | 说明 |
---|---|
distinct() | 去重 |
limit(n) | 返回前n个元素 |
skip(n) | 跳过n个元素 |
sorted() | 排序 |
这里面前面三个方法的使用都比较简单,就不说了,sorted的使用示例,假设有个UserDTO,通过它的age属性进行排序:
userList = userList.stream().sorted(Comparator.comparing(UserDTO::getAge)).collect(Collectors.toList());
如果age有可能为空,就会报错NullPointerException,如果需要支持可以为空,需要写成这样:
userList = userList.stream().sorted(Comparator.comparing(UserDTO::getAge,Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());
另外说一下.parallelStream(),它是一个并行流,和forEach一起使用可以快速遍历,示例:
userDTOList.parallelStream().forEach(u -> {
if (xxx) {
}
});
该段代码就相当于多线程的:
for (User u : userDTOList){
……
}
-end-