java8 stream api 随记

实体类

public class User {

    private  String name;
    private  Integer id;
    private Integer age=18;

    public User( Integer id,String name,Integer age) {
        this.name = name;
        this.id = id;
        this.age=age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

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

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

    static class Leader
    {
        private String name;
        private double salary;

        public String getName() {
            return name;
        }

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

        public double getSalary() {
            return salary;
        }

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

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

测试类

public static void main(String[] args) {
     List<User> list = Arrays.asList(
            new User(1, "Alex", 1000),
            new User(2, "Michael", 2000),
            new User(3, "Jack", 1500),
            new User(4, "Owen", 1500),
            new User(5, "Denny", 2000));
            }

map()

  List<User.Leader> leaders = list.stream().filter(
            employee -> employee.getAge() > 1000).map(employee -> {
        User.Leader leader = new User.Leader();
        leader.setName(employee.getName());
        leader.setSalary(employee.getAge());
        return leader;
    }).peek(leader->System.out.println(leader.getName()+"=="+leader.getSalary()))
    .collect(Collectors.toList());

在这里插入图片描述

findAny()和findFirst()

  //查找任意
    System.out.println(list.stream().findAny().get());
    //第一个元素
    System.out.println(list.stream().findFirst().get());

在这里插入图片描述

filter()

    System.out.println(list.stream().filter(user ->user.getAge() >= 1500&&user.getId()>3)
    .collect(Collectors.toList()));

在这里插入图片描述

peek()

  list.stream().peek(user -> {
            if (user.getId() == 1)
                user.setName("修改后的名称");

        }).collect(Collectors.toList()).forEach(System.out::println);

在这里插入图片描述

allMatch()和anyMatch()

   //所有匹配成功,返还true
    System.out.println(list.stream().allMatch(user -> user.getName().startsWith("A")));
    //任意匹配成功及返还true
    System.out.println(list.stream().anyMatch(user -> user.getName().startsWith("A")));

在这里插入图片描述

distinct()

直接使用达不到效果

直接使用达不到效果,一般会根据需求重写对象的hashCode()和equals()方法
list.stream().distinct().forEach(System.out::println);
在这里插入图片描述

将需要去重的部分单独独立,如将age去重

将需要去重的部分单独独立,如将age去重
list.stream().mapToInt(User::getAge).distinct().forEach(System.out::println);
在这里插入图片描述

自定义去重方法

static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Map<Object, Boolean> seen = new ConcurrentHashMap<>();
    return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
list.stream().filter(distinctByKey(user -> user.getAge()))
.forEach(user -> System.out.println(user.getName()+user.getAge()));

在这里插入图片描述
或者将list改为

 List<User> list = Arrays.asList(
                new User(1, "Alex", 1000),
                new User(1, "Michael", 2000),
                new User(1, "Jack", 1500),
                new User(4, "Owen", 1500),
                new User(5, "Denny", 2000));
list.stream().filter(distinctByKey(user -> user.getId())).forEach(System.out::println);
}

在这里插入图片描述

count()

//过滤再计数
System.out.println(list.stream().filter(user -> user.getId()==1).count());
在这里插入图片描述

limit()

//取2个元素
list.stream().limit(2).forEach(System.out::println);
在这里插入图片描述

max()和min()

 //最大值根据id
    System.out.println(list.stream().max(Comparator.comparing(User::getId)).get());
    //最小值根据id
    System.out.println(list.stream().min(Comparator.comparing(User::getId)).get());

在这里插入图片描述

skip()

//删除3个元素,从前往后
list.stream().skip(3).forEach(System.out::println);

在这里插入图片描述

noneMatch()

//id=0的匹配不到
        System.out.println(list.stream().noneMatch(user -> user.getId() == 0));
//id=1的匹配不到
        System.out.println(list.stream().noneMatch(user -> user.getId() == 1));

在这里插入图片描述

forEachOrdered()

list.stream().forEachOrdered(user -> System.out.println(user.getName()));
在这里插入图片描述

toArray()

System.out.println(list.stream().toArray().length);

在这里插入图片描述

sorted()

升序

//根据age排序
  list.stream().sorted(Comparator.comparing(User::getAge)).forEach(System.out::println);

在这里插入图片描述

降序

//先升序在降序
list.stream().sorted(Comparator.comparing(User::getAge).reversed()).forEach(System.out::println);

在这里插入图片描述

//直接降序
list.stream().sorted(Comparator.comparing(User::getAge,Comparator.reverseOrder()))
.forEach(System.out::println);

在这里插入图片描述

多属性升序

   //在age升序基础上,id也升序
      list.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getId)).forEach(System.out::println);

在这里插入图片描述

  // 在age升序基础上,id降序
      list.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getId,Comparator.reverseOrder())).forEach(System.out::println);

在这里插入图片描述

多属性降序

  // 在age降序基础上,id降序
      list.stream().sorted(Comparator.comparing(User::getAge,Comparator.reverseOrder()).thenComparing(User::getId,Comparator.reverseOrder())).forEach(System.out::println);

在这里插入图片描述

//在age降序基础上,id升序  list.stream().sorted(Comparator.comparing(User::getAge,Comparator.reverseOrder()).thenComparing(User::getId)).forEach(System.out::println);

在这里插入图片描述
所写均为个人理解,理解有误,欢迎指出,谢谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值