java1.8 stream操作

java1.8集合处理

1.8中引入了stream的聚合操作,使数据处理变得简单,下面是自己在学习中总结的一些使用技巧。请多指教。


先引出两个需要用到的类:

public class Person {
 
    private String name;    
    private Intrger age;
 
    public Person() {
        this.name = "init";
        this.age = 0;
    }
 
    public Person(String name, Intrger age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Intrger getAge() {
        return age;
    }
 
    public void setAge(Intrger age) {
        this.age = age;
    }
}
public class Student {
 
    private String name;     
    private Intrger age;
 
    public Student(String name, Intrger age) {
        this.name = name;
        this.age = age;
    }
 
    public Student(Person person) {
        this.name = person.getName();
        this.age = person.getAge();
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Intrger getAge() {
        return age;
    }
 
    public void setAge(Intrger age) {
       this.age = age;
    }
}

下面是具体使用的方法介绍:

排序操作 将空数据排序到最后
//根据age正序
Collections.sort(list, Comparator.comparing(Student::getAge, Comparator.nullsLast(Intrger::compareTo)));
//根据age倒序
Collections.sort(list, Comparator.comparing(BondBsInfoListVo::getCompanyRank, Comparator.nullsLast(Intrger::compareTo)).reversed());
分组操作
//根据name进行分组
Map<String, List<Student>> studentMap = new HashMap<>();
list.stream().collect(Collectors.groupingBy(Student::getName)).forEach(
                    (name, newList) -> {
                        studentMap .put(name, newList);
                    }
            );

//方法二
Map<String, Student> studentMap = list.stream().collect(Collectors.toMap(a -> a.getName(), a -> a, (key1, key2) -> key1));
//方法三
Map<Long, List<HouseGoodsID>> map = list.stream().collect(Collectors.groupingBy(HouseGoodsID::getHouseID));
skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream, 如果原Stream中包含的元素个数小于N,那么返回空Stream;
 
list.stream().skip(index).collect(Collectors.toList());
limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
 
list.stream().limit(index).collect(Collectors.toList());
分页操作
int pageNo = 1;//当前页数
int pageNo = 20;//每页显示条数
int start = (pageNo - 1) * pageSize;
list = list.stream().skip(start).collect(Collectors.toList());
list = list.stream().limit(pageSize).collect(Collectors.toList());
filter:过滤;
 
过滤出年龄大于19的人:
 
list.stream().filter(person -> (person.getAge() > 19)).collect(Collectors.toList());
map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗;
 
List<Student> students =
list.stream().map(person -> new Student(person.getName(), person.getAge())).collect(Collectors.toList());
 
List<String> names = list.stream().map(Person::getName).collect(Collectors.toList());
 
int[] ages = list.stream().mapToInt(Person::getAge).toArray();
累加、最大值、最小值、平均值等

//Integer
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(7);
list.add(2);
IntSummaryStatistics collect = list.stream().map(Student::getAge).collect(Collectors.summarizingInt(value -> value));
System.out.println(collect);
System.out.println("统计集合元素的个数:" + collect.getCount());
System.out.println("集合元素累加之和:" + collect.getSum());
System.out.println("集合中最小值:" + collect.getMax());
System.out.println("集合中最大值:" + collect.getMin());
System.out.println("集合中平均值:" + collect.getAverage());
打印结果:IntSummaryStatistics{count=3, sum=12, min=2, average=4.000000, max=7}
统计集合元素的个数:3
集合元素累加之和:12
集合中最小值:7
集合中最大值:2
集合中平均值:4.0


//BigDecimal   假设Person中age为BigDecimal类型
Person p1 = new Person("张三", new BigDecimal("11.0"));
Person p2 = new Person("王五", new BigDecimal("10.0"));
Person p3 = new Person("李四", new BigDecimal("9.0"));
Person p4 = new Person("王五", new BigDecimal("10.0"));
Person p5 = new Person("赵六", new BigDecimal("10.0"));
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
BigDecimal sum = list.stream().map(Person::getAge).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal max = list.stream().map(Person::getAge).reduce(BigDecimal.ZERO, BigDecimal::max);
BigDecimal min = list.stream().map(Person::getAge).reduce(BigDecimal.ZERO, BigDecimal::min);
System.out.println("年龄总计:" + sum);
System.out.println("年龄最大:" + max);
System.out.println("年龄最小:" + min);

打印结果:
年龄总计:50.0
年龄最大:11.0
年龄最小:9.0
多条件排序:
//先根据age排序 在根据name排序   
list.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));
count:计数;
 
统计年龄大于19的人的数量:
 
long count = list.stream().filter(person -> (person.getAge() > 19)).count();
字段运算或求值
//int
list.stream().mapToInt(Person::getAge).sum();
list.stream().mapToInt(Person::getAge).max();
list.stream().mapToInt(Person::getAge).min();
list.stream().mapToInt(Person::getAge).average();
//double
list.stream().mapToDouble(Person::getAge).sum()//和
list.stream().mapToDouble(Person::getAge).max()//最大
list.stream().mapToDouble(Person::getAge).min()//最小
list.stream().mapToDouble(Person::getAge).average()//平均值

map.entrySet().removeIf(entry -> entry.getValue() == null);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值