java8 stream 过滤、排序、求和、分组、去重等方法使用和说明

时间:2024-11-09 15:38:24

定义一个实体

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