文章目录
- Java Stream 流操作常用 API
- 一、准备工作
- 二、Stream 常用 API
- 1、sorted 排序
- 2、list 转为 map(并解决重复key问题)
- 3、filter 方法过滤指定查询条件
- 4、根据指定列分组
- 5、通过 map 获取指定列集合
- 6、根据 List 中 Object 某个属性去重
- 7、list 统计(求和、最大、最小、平均)
- 8、anyMatch / allMatch / noneMatch
- anyMatch:任意一个元素符合条件
- allMatch:全部元素符合条件
- noneMatch:全部元素不符合条件
- 9、peek() 用法
Java Stream 流操作常用 API
一、准备工作
定义实体类:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVos {
private Long id;
private String name;
private Integer age;
public static void printUsers(List<UserVos> userVoList){
System.out.println("==========================================");
userVoList.forEach(userVo -> {
System.out.println(userVo.toString());
});
System.out.println("==========================================");
}
}
二、Stream 常用 API
1、sorted 排序
sorted 排序(Integer 类型)默认是升序,reversed() 为降序。
代码示例:
public static void main(String[] args) {
List<UserVos> userVoList = new ArrayList<>();
userVoList.add(new UserVos(1l,"刘亦菲",28));
userVoList.add(new UserVos(2l,"刘诗诗",24));
userVoList.add(new UserVos(3l,"吴奇隆",12));
userVoList.add(new UserVos(4l,"胡彦斌",4));
userVoList.add(new UserVos(5l,"吴彦祖",56));
userVoList.add(new UserVos(6l,"谢广坤",99));
//降序
List<UserVos> voList = userVoList.stream().sorted(Comparator.comparing(UserVos::getAge).reversed()).collect(Collectors.toList());
//升序
List<UserVos> voList = userVoList.stream().sorted(Comparator.comparing(UserVos::getAge)).collect(Collectors.toList());
UserVos.printUsers(voList);
}
打印结果:
==========================================
UserVos(id=6, name=谢广坤, age=99)
UserVos(id=5, name=吴彦祖, age=56)
UserVos(id=1, name=刘亦菲, age=28)
UserVos(id=2, name=刘诗诗, age=24)
UserVos(id=3, name=吴奇隆, age=12)
UserVos(id=4, name=胡彦斌, age=4)
==========================================
2、list 转为 map(并解决重复key问题)
代码示例:
Map<String, Integer> map1 = userVoList.stream()
.collect(Collectors.toMap(UserVos::getName, UserVos::getAge, (v1, v2) -> v1));
System.out.println("转为map的数据为"+map1);
打印结果:
转为map的数据为{吴奇隆=12, 胡彦斌=4, 刘亦菲=28, 吴彦祖=56, 刘诗诗=24, 谢广坤=99}
3、filter 方法过滤指定查询条件
代码示例:
// 查询age>20并且age<43的数据
List<UserVos> collect = userVoList.stream().filter((e) ->
e.getAge() > 20 && e.getAge() < 43
).collect(Collectors.toList());
打印结果:
过滤后的数据为
==========================================
UserVos(id=1, name=刘亦菲, age=28)
UserVos(id=2, name=刘诗诗, age=24)
==========================================
4、根据指定列分组
代码示例:
Map<Integer, List<UserVos>> map = userVoList.stream().collect(Collectors.groupingBy(UserVos::getAge));
System.out.println("根据指定列分组"+map);
打印结果:
根据指定列分组{99=[UserVos(id=6, name=谢广坤, age=99)], 4=[UserVos(id=4, name=胡彦斌, age=4)], 56=[UserVos(id=5, name=吴彦祖, age=56)], 24=[UserVos(id=2, name=刘诗诗, age=24)], 12=[UserVos(id=3, name=吴奇隆, age=12)], 28=[UserVos(id=1, name=刘亦菲, age=28)]}
5、通过 map 获取指定列集合
代码示例:
List<Integer> ageList = userVoList.stream()
.map(UserVos::getAge)
.collect(Collectors.toList());
System.out.println("通过map获取指定年龄列集合"+ageList);
打印结果:
通过map获取指定年龄列集合[28, 24, 12, 4, 56, 99]
6、根据 List 中 Object 某个属性去重
代码示例:
// 这里我们引入了两个静态方法,以及通过 TreeSet<> 来达到获取不同元素的效果
// 1. import static java.util.stream.Collectors.collectingAndThen;
// 2. import static java.util.stream.Collectors.toCollection;
ArrayList<UserVos> collect = userVoList.stream().collect(collectingAndThen(
toCollection(() -> new TreeSet<>(Comparator.comparing(UserVos::getName))), ArrayList::new));
UserVos.printUsers(collect);
打印结果:
==========================================
UserVos(id=1, name=刘亦菲, age=28)
UserVos(id=2, name=刘诗诗, age=24)
UserVos(id=3, name=吴奇隆, age=12)
UserVos(id=5, name=吴彦祖, age=56)
UserVos(id=4, name=胡彦斌, age=4)
UserVos(id=6, name=谢广坤, age=99)
==========================================
7、list 统计(求和、最大、最小、平均)
double sum = userVoList.stream().mapToDouble(UserVos::getAge).sum();//和
OptionalDouble max = userVoList.stream().mapToDouble(UserVos::getAge).max();//最大
OptionalDouble min = userVoList.stream().mapToDouble(UserVos::getAge).min();//最小
OptionalDouble average = userVoList.stream().mapToDouble(UserVos::getAge).average();//平均值
System.out.println("和"+sum);
System.out.println("最大"+max.getAsDouble());
System.out.println("最小"+min.getAsDouble());
System.out.println("平均值"+average.getAsDouble());
打印结果:
和223.0
最大99.0
最小4.0
平均值37.166666666666664
8、anyMatch / allMatch / noneMatch
anyMatch:任意一个元素符合条件
代码示例:
public static void main(String[] args) {
List<String> list = Arrays.asList("Y", "A", "B");
boolean boo = list.stream().anyMatch(str -> "Y".equals(str));
if (boo) {
System.out.println("存在字符串等于 Y");
}
}
打印结果:
allMatch:全部元素符合条件
代码示例:
public static void main(String[] args) {
List<String> list = Arrays.asList("Y", "A", "B");
boolean boo = list.stream().allMatch(str -> "Y".equals(str));
if (boo) {
System.out.println("所有字符串等于 Y");
} else {
System.out.println("存在字符串不等于 Y");
}
}
打印结果:
noneMatch:全部元素不符合条件
代码示例:
public static void main(String[] args) {
List<String> list = Arrays.asList("Y", "A", "B");
boolean boo = list.stream().noneMatch(str -> "Y".equals(str));
if (boo) {
System.out.println("所有字符串不等于 Y");
} else {
System.out.println("存在字符串等于 Y");
}
}
打印结果:
9、peek() 用法
java stream 的 peek() 用法