jdk8新特性

jdk8引入了强大了stream API极大了简化了代码,下面我们来看看常用的api以及作用

user类

public class User {
    private String name;
    private Integer age;
    private Double salary;
    private Status status;

    public enum Status{
        BUSY,
        FREE;
    }

    public User() {
    }

    public User(String name, Integer age, Double salary, Status status) {
        this.name = name;
        this.age = age;
        this.salary = salary;
        this.status = status;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                ", status=" + status +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) && Objects.equals(age, user.age) && Objects.equals(salary, user.salary) && status == user.status;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, salary, status);
    }
}

测试list

List<User> userList = Arrays.asList(new User("张三",23,6666d, User.Status.BUSY),
                new User("李四",18,7777d, User.Status.BUSY),
                new User("王五",26,5670D, User.Status.BUSY),
                new User("王二",45,0d, User.Status.FREE),
                new User("麻子",23,0d, User.Status.FREE),
                new User("麻子",23,0d, User.Status.FREE));

1.filter()----选出符合条件的元素

选出符合条件的元素,例如选出年龄大于24的用户
List<User> userList1 = userList.stream().filter(e -> e.getAge() > 24).collect(Collectors.toList());

2.distinct()----去重,通过流生成的元素的hashCode()和equals()方法去除重复元素

List<User> userList1 = userList.stream().distinct().collect(Collectors.toList());

3.limit()----使元素不超过给定的数量,skip()----跳过指定的元素个数,两个配合使用可以用来做复杂的分页,具体可以看jdk多数据源分页

4.sorted()----自然排序

//根据年龄从大到小排序
List<User> userList1 = userList.stream().sorted((e1, e2) -> {
    return -e1.getAge().compareTo(e2.getAge());
}).collect(Collectors.toList());

5allMatch()----检查是否匹配所以元素

//检查是否所有的用户都繁忙
boolean b = userList.stream().allMatch(e -> e.getStatus().equals(User.Status.BUSY));

6.anyMatch()----是否至少匹配一个元素

//检查当前是否有员工空闲
boolean b = userList.stream().anyMatch(e -> e.getStatus().equals(User.Status.FREE));

7.findFirst()----返回第一个元素

//查找工资最高的一个用户的信息,现根据工资从高到低排序,然后找出第一个元素
User user = userList.stream().sorted((e1,e2) -> -e1.getSalary().compareTo(e2.getSalary())).findFirst().get();

8.findAny()----返回当前流中的任意一个元素

//返回当前空闲用户中的任何一个分配任务
User user = userList.stream().filter(e -> e.getStatus().equals(User.Status.FREE)).findAny().get();

9.reduce()----可以将流中元素反复结合起来,得到一个值

//得到当前所有用户的工资总和
Double aDouble = userList.stream().map(User::getSalary).reduce(Double::sum).get();

10.collect—将流转换成其他形式,接受一个Collector接口的实现,用于给stream中元素做汇总

//从当前所有用户中取出姓名作为一个List<String>
List<String> stringList = userList.stream().map(User::getName).collect(Collectors.toList());
//分组,根据空闲或者繁忙分组
Map<User.Status, List<User>> collect = userList.stream().collect(Collectors.groupingBy(User::getStatus));
//将名字链接为一个字符串,以","隔开
String str = userList.stream().map(User::getName).collect(Collectors.joining(","));

另外,还有两个集合之间的操作,并集、差集等

List<String> list1 = new ArrayList<String>();
    list1.add("1");
	list1.add("2");
	list1.add("3");
	list1.add("5");
	list1.add("6");
 
    List<String> list2 = new ArrayList<String>();
    list2.add("2");
	list2.add("3");
	list2.add("7");
	list2.add("8");
 
    // 交集  2,3
    List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());
    System.out.println("---交集 intersection---");
    intersection.parallelStream().forEach(System.out :: println);
 
    // 差集 (list1 - list2)
    List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
    System.out.println("---差集 reduce1 (list1 - list2)---");
    reduce1.parallelStream().forEach(System.out :: println);
 
    // 差集 (list2 - list1)
    List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
    System.out.println("---差集 reduce2 (list2 - list1)---");
    reduce2.parallelStream().forEach(System.out :: println);
 
    // 并集 123562378
    List<String> listAll = list1.parallelStream().collect(toList());
    List<String> listAll2 = list2.parallelStream().collect(toList());
    listAll.addAll(listAll2);
    System.out.println("---并集 listAll---");
    listAll.parallelStream().forEachOrdered(System.out :: println);
 
    // 去重并集    1235678
    List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
    System.out.println("---得到去重并集 listAllDistinct---");
    listAllDistinct.parallelStream().forEachOrdered(System.out :: println);
 
    System.out.println("---原来的List1---");
    list1.parallelStream().forEachOrdered(System.out :: println);
    System.out.println("---原来的List2---");
    list2.parallelStream().forEachOrdered(System.out :: println);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值