定义一个实体
import ;
@Data
public class TestVO {
/**
* 主键
*/
private long id;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private String age;
public static void printStudents(List<TestVO> testVOS){
("-------------------------------");
(s->(()));
(" ");
}
}
按年龄排序(Integer类型)默认是升序,reversed()为降序
public static void main(String[] args) {
// 测试数据,请不要纠结数据的严谨性
List<TestVO> list = new ArrayList<>();
(new TestVO(1,"李小明",18));
(new TestVO(2,"张小丽",19));
(new TestVO(3,"王大朋",16));
(new TestVO(4,"陈小跑",10));
// 按年龄排序(Integer类型)默认是升序,reversed()为降序
List<TestVO> ageList1 = ().sorted((TestVO::getAge).reversed())
.collect(());
(ageList1);
}
输出为
----------------------------------------------------------
TestVO(id=2, name=张小丽, age=19)
TestVO(id=1, name=李小明, age=18)
TestVO(id=3, name=王大朋, age=16)
TestVO(id=4, name=陈小跑, age=10)
将list转为map(并解决重复key问题)、在将map转换成list
Map<Integer, Integer> idAndAgeMap = list.stream()
.collect(Collectors.toMap(TestVO::getId, TestVO::getAge, (v1, v2) -> v1));
System.out.println("转为map的数据为"+idAndAgeMap );
转为map的数据为{1=18, 2=19, 3=16, 4=10}
List<Param> paramList = map.keySet().stream()
.map(key -> {
Param param= new Param();
param.setCmd(key);
param.setParam(idAndAgeMap .get(key));
return param;
})
.collect(Collectors.toList());
过滤指定查询条件(查询age>15并且age<18的数据)
List<TestVO> collect = ().filter((e) ->
() > 15 && () < 18
).collect(());
("过滤后的数据为");
(collect);
过滤后的数据为
----------------------------------------------------------
TestVO(id=3, name=王大朋, age=16)
根据指定列分组
Map<Integer, List<TestVO>> map = ().collect((TestVO::getAge));
("根据指定列分组"+map);
根据指定列分组{
16=[TestVO(id=3, name=王大朋, age=16)],
18=[TestVO(id=1, name=李小明, age=18)],
19=[TestVO(id=2, name=张小丽, age=19)],
10=[TestVO(id=4, name=陈小跑, age=10)]
}
通过map获取指定列集合
List<Integer> ageList = ()
.map(TestVO::getAge)
.collect(());
("通过map获取指定年龄列集合"+ageList);
通过map获取指定年龄列集合[18, 19, 16, 10]
根据 List 中 Object 某个属性去重
// 测试数据,请不要纠结数据的严谨性
List<TestVO> list = new ArrayList<>();
(new TestVO(1,"李小明",18));
(new TestVO(2,"李小明",19));
(new TestVO(3,"王大朋",16));
(new TestVO(4,"陈小跑",10));
// 这里我们引入了两个静态方法,以及通过 TreeSet<> 来达到获取不同元素的效果
// 1. import static ;
// 2. import static ;
ArrayList<TestVO> collect = ().collect(collectingAndThen(
toCollection(() -> new TreeSet<>((TestVO::getName))), ArrayList::new));
(collect);
----------------------------------------------------------
TestVO(id=1, name=李小明, age=18)
TestVO(id=3, name=王大朋, age=16)
TestVO(id=4, name=陈小跑, age=10)
list统计(求和、最大、最小、平均)
// 测试数据,请不要纠结数据的严谨性
List<TestVO> list = new ArrayList<>();
(new TestVO(1,"李小明",18));
(new TestVO(2,"李小明",19));
(new TestVO(3,"王大朋",16));
(new TestVO(4,"陈小跑",10));
double sum = ().mapToDouble(TestVO::getAge).sum();//和
OptionalDouble max = ().mapToDouble(TestVO::getAge).max();//最大
OptionalDouble min = ().mapToDouble(TestVO::getAge).min();//最小
OptionalDouble average = ().mapToDouble(TestVO::getAge).average();//平均值
("和"+sum);
("最大"+());
("最小"+());
("平均值"+());
和63.0
最大19.0
最小10.0
平均值15.75
list分组统计(求和、最大、最小、平均)
// 测试数据,请不要纠结数据的严谨性
List<TestVO> list = new ArrayList<>();
(new TestVO(1,"李小明",18));
(new TestVO(2,"李小明",19));
(new TestVO(3,"王大朋",16));
(new TestVO(4,"陈小跑",10));
// 分组并求count(counting方法返回所收集元素的总数)
Map<Integer, Long> sexCount = ().collect((TestVO::getName,()));
// 分组并求sum(summing方法会对元素求和)
Map<Integer, Integer> ageCount = ().collect((TestVO::getName,(TestVO::getAge)));
// 分组并求最大、最小值 (maxBy和minBy会接受一个比较器,求最大值,最小值)
Map<Integer, Optional<User>> ageMax = ().collect((TestVO::getName,((TestVO::getAge))));
// 如果想一次操作直接完成求和、求count、求最大、求最小也可以((Int/Long/Double)就是为你准备的,它可以一次行获取前面的所有结果,其返回值为(Int/Long/Double)SummaryStatistics)
DoubleSummaryStatistics dss = ().collect(((TestVOp)->));
double average=();
double max=();
double min=();
double sum=();
double count=();
// 分组并取只取对象中某一个元素集合(mapping函数会应用到downstream结果上,并需要和其他函数配合使用)
Map<Integer, List<String>> nameMap = ().collect((TestVO::getName,(TestVO::getName,())));
更为详细方法参考:/zh/articles/j-lo-java8streamapi