java1.8 list 使用技巧

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

 


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

public class Person {

    private String name;    
    private int age;

    public Person() {
        this.name = "init";
        this.age = 0;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    private String name;     
    private int age;

    public Student(String name, int 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 int getAge() {
        return age;
    }

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

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

forEach:遍历;

list.stream().forEach(e -> {
   …
});
list转换: 数组转换为list;

Stream.of(arrays).collect(Collectors.toList());
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());
reduce: 允许通过指定的函数来讲stream中的多个元素规约为一个元素;

list.stream().reduce((s1, s2) -> s1 + s2);
match: 检测指定的Predicate是否匹配整个Stream。所有的匹配操作都是最终操作,并返回一个boolean类型的值;

list.stream().anyMatch(str -> str.startsWith("a"));

list.stream().allMatch(str -> str.startsWith("a"));

list.stream().noneMatch(str ->str.startsWith("a"));
distinct:对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法),新生成的Stream中没有重复的元素;

list.stream().distinct().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();
filter:过滤;

过滤出年龄大于19的人:

list.stream().filter(person -> (person.getAge() > 19)).collect(Collectors.toList());
group:分组;

按年龄分组:
list.stream().collect(Collectors.groupingBy(Person::getAge)).forEach(
    (age, personList) -> {
           personMap.put(age, personList);
       }
);
sort:排序;

list.sort((Person p1, Person p2) -> p2.getName().compareTo(p1.getName()));
正序:

Collections.sort(list, Comparator.comparing(Person::getAge));
倒序:

Collections.sort(list, Comparator.comparing(Person::getAge).reversed());
多条件排序:

list.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));
count:计数;

统计年龄大于19的人的数量:

long count = list.stream().filter(person -> (person.getAge() > 19)).count();
sum:求和;

计算年龄总和:

int sum = list.stream().mapToInt(Person::getAge).sum();
max 和 min;

list.stream().max((num1, num2) -> num1.compareTo(num2)).get();

list.stream().min((num1, num2) -> num1.compareTo(num2)).get();
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值