java8 stream按需汇总数据Demo


测试实体类:
class Numer{
	private int age;
	private int sum1;
	private Map<Integer,Integer> map11;

	 public int getAge() {
		 return age;
	 }

	 public void setAge(int age) {
		 this.age = age;
	 }

	 public int getSum1() {
		 return sum1;
	 }

	 public void setSum1(int sum1) {
		 this.sum1 = sum1;
	 }

	 public Map<Integer, Integer> getMap11() {
		 return map11;
	 }

	 public void setMap11(Map<Integer, Integer> map11) {
		 this.map11 = map11;
	 }

	 public Numer(int age, int sum1, Map<Integer, Integer> map11) {
		 this.age = age;
		 this.sum1 = sum1;
		 this.map11 = map11;
	 }

	 public Numer(int age, Map<Integer, Integer> map11) {
		 this.age = age;
		 this.map11 = map11;
	 }

	 @Override
	 public String toString() {
		 return "Numer{" +
				 "age=" + age +
				 ", sum1=" + sum1 +
				 ", map11=" + map11 +
				 '}';
	 }

	 public Numer() {
	 }

	 public Numer(int age, int sum1) {
		 this.age = age;
		 this.sum1 = sum1;
	 }

数据构造:

Map<Integer,Integer> map=new HashMap<>();
		map.put(1,1);
		map.put(2,1);
		map.put(3,1);
		map.put(4,1);
		map.put(5,1);
		map.put(6,1);
		map.put(7,1);
		List<Numer> numers=Arrays.asList(new Numer(1,map),new Numer(1,map),new Numer(1,map));
 
 
1.将numers中的每个Numer对象的Map中的数据key值小于4的value相加放在Numer对象的sum1属性中

实现方式1:
List<Numer> nums=new ArrayList<Numer>();
		numers.stream()
				.forEach(a->{nums.add(new Numer(a.getAge(),a.getMap11().entrySet().stream()
				.filter(b->b.getKey()<=3)
				.map(Map.Entry::getValue)
				.reduce(Integer::sum).get().intValue(),a.getMap11()));});

		nums.stream().forEach(System.out::println);
运行输出:
Numer{age=1, sum1=3, map11={1=1, 2=1, 3=1, 4=1, 5=1, 6=1, 7=1}}
Numer{age=1, sum1=3, map11={1=1, 2=1, 3=1, 4=1, 5=1, 6=1, 7=1}}
Numer{age=1, sum1=3, map11={1=1, 2=1, 3=1, 4=1, 5=1, 6=1, 7=1}}
其中的sum1属性的结果均为3.
实现方式2:(原理和1相同)
List<Numer> nums2=numers.stream()
				.map(a->{return new Numer(a.getAge(),a.getMap11().entrySet().stream()
					.filter(b->b.getKey()<=3)
					.map(Map.Entry::getValue).reduce(Integer::sum).get().intValue(),a.getMap11()
				);}).collect(Collectors.toList());


		nums2.stream().forEach(System.out::println);

Numer{age=1, sum1=3, map11={1=1, 2=1, 3=1, 4=1, 5=1, 6=1, 7=1}}
Numer{age=1, sum1=3, map11={1=1, 2=1, 3=1, 4=1, 5=1, 6=1, 7=1}}
Numer{age=1, sum1=3, map11={1=1, 2=1, 3=1, 4=1, 5=1, 6=1, 7=1}}
2.将list中的属性加总,且map汇总后的结果也加总
Numer numer=numers.stream()
				.map(a->{return new Numer(a.getAge(),a.getMap11().entrySet().stream()
						.filter(b->b.getKey()<=3)
						.map(Map.Entry::getValue).reduce(Integer::sum).get().intValue(),a.getMap11()
				);})
				.reduce(new Numer(),(c,d)->new Numer(c.getAge()+d.getAge(),c.getSum1()+d.getSum1()));
		System.out.print(numer.toString());

输出:
Numer{age=3, sum1=9, map11=null}

可能存在BUG,应该有更好的实现方案,欢迎指正。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值