测试实体类:
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;
}
数据构造:
测试实体类:
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,应该有更好的实现方案,欢迎指正。