目录
Java 8 引入了 Stream API,这是一个新的抽象层,旨在提高对集合的操作和处理的效率和简便性。Stream API 强调的是一种功能性的近似,通过利用更高级的迭代操作,可以实现更简洁和更易于理解的代码。
1. 过滤 (Filter)
使用 .filter() 方法可以从流中排除某些元素。该方法接受一个 Predicate 函数式接口作为参数(一个返回布尔值的函数)。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
2. 映射 (Map)
.map() 方法用于将流中的每个元素映射到另一个元素。它接受一个 Function 接口。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
3. 排序 (Sorted)
.sorted() 方法用于对流中的元素进行排序。它可以采用自然排序或者接受一个自定义的 Comparator。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
4. 归约 (Reduce)
.reduce() 方法用于通过某个操作合并流中的所有元素。它是一个终端操作,返回一个 Optional 类型的结果。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b);
5. 收集 (Collect)
.collect() 方法是一个终端操作,它接受一个 Collector 实例并将流元素转换成不同类型的结果,如列表、集合或者其他数据结构。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> listNames = names.stream()
.collect(Collectors.toList());
6. 匹配 (Match)
流 API 提供了三种匹配操作:anyMatch(), allMatch(), 和 noneMatch(),它们都接受一个 Predicate 并返回一个 boolean 值。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0); // false
boolean anyEven = numbers.stream()
.anyMatch(n -> n % 2 == 0); // true
boolean noneMatch = numbers.stream()
.noneMatch(n -> n > 10); // true
7. 查找 (Find)
.findFirst() 和 .findAny() 方法提供了一种方法来检索流中的元素。这些方法返回 Optional 类型的对象。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Optional<String> first = names.stream()
.findFirst();
8. 统计 (Count)
.count() 方法返回流中元素的数量。
long count = names.stream().count();
9. 并行流 (Parallel Streams)
.parallelStream() 方法可以并行处理元素,利用多核处理器的优势来加速处理过程。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sumParallel = numbers.parallelStream()
.reduce(0, Integer::sum);
应用
List转Map
1v1-list转map:
public static void main(String[] args) {
List<UserVO> list = new ArrayList<>();
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
list.add(userVO);
}
//以整个对象为value
Map<Integer,UserVO> map = list.stream().collect(Collectors.toMap(UserVO::getUserId,u->u));
//以对象某个属性为value
Map<Integer,String> nameMap = list.stream().collect(Collectors.toMap(UserVO::getUserId,UserVO::getFullName));
}
1vN-list转map:
public static void main(String[] args) {
List<UserVO> list = new ArrayList<>();
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
list.add(userVO);
}
//以整个对象为value
Map<Integer,List<UserVO>> map = list.stream().collect(Collectors.groupingBy(UserVO::getOrgId,Collectors.toList()));
}
Set转Map
1vN-set转map:
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
//以整个对象为value
Map<Integer,List<UserVO>> map = set.stream().collect(Collectors.groupingBy(UserVO::getOrgId,Collectors.toList()));
}
1v1-set转map:
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
//以整个对象为value
Map<Integer,UserVO> entityMap = set.stream().collect(Collectors.toMap(UserVO::getUserId,u->u));
//以某一属性为value
Map<Integer,String> map = set.stream().collect(Collectors.toMap(UserVO::getUserId,UserVO::getFullName));
}
Set与List互相转化
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
List<UserVO> list = set.stream().collect(Collectors.toList());
Set<UserVO> setNew = list.stream().collect(Collectors.toSet());
}
字符串转化成List
public static void main(String[] args) {
String str = "2312,1,524,67,23,58,32";
ArrayList<Integer> list = Arrays.stream(str.split(","))
.map(String::trim).map(Integer::valueOf)
.collect(Collectors.toCollection(ArrayList::new));
System.out.println(list);
}
List/Set中某一列求和
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
Integer sum = set.stream().mapToInt(UserVO::getOrgId).sum();
List<UserVO> list = set.stream().collect(Collectors.toList());
Integer sum1 = list.stream().mapToInt(UserVO::getOrgId).sum();
}
根据条件过滤转化
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
List<UserVO> list = set.stream().filter(u->u.getUserId()<10).collect(Collectors.toList());
System.out.println(list.size());
}
List/Set对象的某一属性组成新的list/set
public static void main(String[] args) {
Set<UserVO> set = new HashSet<>();
for(int i = 0;i<100;i++){
UserVO userVO = new UserVO();
userVO.setUserId(i+1);
userVO.setOrgId(i%3);
userVO.setFullName("li"+i);
set.add(userVO);
}
List<String> list = set.stream().map(UserVO::getFullName).collect(Collectors.toList());
}