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

定义一个实体

import lombok.Data;


@Data
public class TestVO {


	/**
	 * 主键
	 */
	private  long id;

	/**
	 * 姓名
	 */
	private String name;

	/**
	 * 年龄
	 */
	private String age;
	
	public static void printStudents(List<TestVO> testVOS){
		System.out.println("-------------------------------");
		testVOS.forEach(s->System.out.println(s.toString()));
		System.out.println(" ");
	}
	
}

按年龄排序(Integer类型)默认是升序,reversed()为降序

public static void main(String[] args) {

		// 测试数据,请不要纠结数据的严谨性
		List<TestVO> list = new ArrayList<>();
		list.add(new TestVO(1,"李小明",18));
		list.add(new TestVO(2,"张小丽",19));
		list.add(new TestVO(3,"王大朋",16));
		list.add(new TestVO(4,"陈小跑",10));
		
		// 按年龄排序(Integer类型)默认是升序,reversed()为降序
		List<TestVO> ageList1 = list.stream().sorted(Comparator.comparing(TestVO::getAge).reversed())
			.collect(Collectors.toList());

		TestVO.printStudents(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 = list.stream().filter((e) ->
		e.getAge() > 15 && e.getAge() < 18
	).collect(Collectors.toList());

	System.out.println("过滤后的数据为");
	TestVO.printStudents(collect);
	
过滤后的数据为
----------------------------------------------------------
TestVO(id=3, name=王大朋, age=16)

根据指定列分组

Map<Integer, List<TestVO>> map = list.stream().collect(Collectors.groupingBy(TestVO::getAge));

System.out.println("根据指定列分组"+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 = list.stream()
		.map(TestVO::getAge)
		.collect(Collectors.toList());

System.out.println("通过map获取指定年龄列集合"+ageList);

通过map获取指定年龄列集合[18, 19, 16, 10]

根据 List 中 Object 某个属性去重


// 测试数据,请不要纠结数据的严谨性
List<TestVO> list = new ArrayList<>();
list.add(new TestVO(1,"李小明",18));
list.add(new TestVO(2,"李小明",19));
list.add(new TestVO(3,"王大朋",16));
list.add(new TestVO(4,"陈小跑",10));
		
// 这里我们引入了两个静态方法,以及通过 TreeSet<> 来达到获取不同元素的效果
// 1. import static java.util.stream.Collectors.collectingAndThen;
// 2. import static java.util.stream.Collectors.toCollection;

ArrayList<TestVO> collect = list.stream().collect(collectingAndThen(
				toCollection(() -> new TreeSet<>(Comparator.comparing(TestVO::getName))), ArrayList::new));
				
TestVO.printStudents(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<>();
list.add(new TestVO(1,"李小明",18));
list.add(new TestVO(2,"李小明",19));
list.add(new TestVO(3,"王大朋",16));
list.add(new TestVO(4,"陈小跑",10));

double sum = list.stream().mapToDouble(TestVO::getAge).sum();//和
OptionalDouble max = list.stream().mapToDouble(TestVO::getAge).max();//最大
OptionalDouble min = list.stream().mapToDouble(TestVO::getAge).min();//最小
OptionalDouble average = list.stream().mapToDouble(TestVO::getAge).average();//平均值

System.out.println("和"+sum);
System.out.println("最大"+max.getAsDouble());
System.out.println("最小"+min.getAsDouble());
System.out.println("平均值"+average.getAsDouble());

和63.0
最大19.0
最小10.0
平均值15.75

list分组统计(求和、最大、最小、平均)

// 测试数据,请不要纠结数据的严谨性
List<TestVO> list = new ArrayList<>();
list.add(new TestVO(1,"李小明",18));
list.add(new TestVO(2,"李小明",19));
list.add(new TestVO(3,"王大朋",16));
list.add(new TestVO(4,"陈小跑",10));

// 分组并求count(counting方法返回所收集元素的总数)
Map<Integer, Long> sexCount = list.stream().collect(Collectors.groupingBy(TestVO::getName,Collectors.counting()));

// 分组并求sum(summing方法会对元素求和)
Map<Integer, Integer> ageCount = list.stream().collect(Collectors.groupingBy(TestVO::getName,Collectors.summingInt(TestVO::getAge)));

// 分组并求最大、最小值 (maxBy和minBy会接受一个比较器,求最大值,最小值)
Map<Integer, Optional<User>> ageMax =  list.stream().collect(Collectors.groupingBy(TestVO::getName,Collectors.maxBy(Comparator.comparing(TestVO::getAge))));

// 如果想一次操作直接完成求和、求count、求最大、求最小也可以(Collectors.summarizing(Int/Long/Double)就是为你准备的,它可以一次行获取前面的所有结果,其返回值为(Int/Long/Double)SummaryStatistics)
DoubleSummaryStatistics dss = list.stream().collect(Collectors.summarizingDouble((TestVOp)->p.age));
double average=dss.getAverage();
double max=dss.getMax();
double min=dss.getMin();
double sum=dss.getSum();
double count=dss.getCount();

// 分组并取只取对象中某一个元素集合(mapping函数会应用到downstream结果上,并需要和其他函数配合使用)
Map<Integer, List<String>> nameMap =  list.stream().collect(Collectors.groupingBy(TestVO::getName,Collectors.mapping(TestVO::getName,Collectors.toList())));

更为详细方法参考:https://developer.ibm.com/zh/articles/j-lo-java8streamapi

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值