zoukankan      html  css  js  c++  java
  • 【Java】【6】JDK8 Stream操作整理

    摘要:

    1,List<EntityOld>转换为List<EntityNew>

    2,从一个实体类List中取出某个字段组成新的list

    3,从list中筛选出符合条件的数据组成新的list

    4,求list集合中某个字段的和

    5,根据某字段对list进行分组

    6,根据某字段对list进行分组并计数

    7,根据字段排序

    8,多条数据取第一条

    正文:

    1,List<EntityOld>转换为List<EntityNew>

    List<EntityOld> list = oldList;
    List<EntityNew> newList = list.stream().map(EntityNew::new).collect(Collectors.toList());

    2,从一个实体类List中取出某个字段组成新的list

    List<EntityOld> list = oldList;
    List<String> idList = list.stream().map(EntityOld::getOldId).collect(Collectors.toList()); 

    3,从list中筛选出符合条件的数据组成新的newList

    普通for循环:

    List<Student> list = new ArrayList<>(); //Student1: name:张三;age:18 //Student2: name:张三;age:20
    List<StudentVo> newList = new ArrayList<>();
    list.stream().forEach(item -> {    
        if (item.getAge() > 18) {
            StudentVo info = new StudentVo();
            info.setName(item.getName());
            newList.add(info);
        }    
    });

    加filter:

    //超过18岁
    List<Student> newList = list.stream().filter(i -> this.checkAgeOver18(i.getAge())).collect(Collectors.toList());
    
    private Boolean checkAgeOver18 (int age) {
        return age > 18;
    }
    
    //简化版,但是条件复杂的话最好就封装成一个方法了
    List<Student> newList = list.stream().filter(i -> i.getAge() > 18).collect(Collectors.toList());

    4,求list集合中某个字段的和

    List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
    IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
    System.out.println("所有数之和 : " + stats.getSum());
    System.out.println("列表中最大的数 : " + stats.getMax());
    System.out.println("列表中最小的数 : " + stats.getMin());
    System.out.println("平均数 : " + stats.getAverage());
    List<Student> list = new ArrayList<>(); //Student1: name:张三;age:18 //Student2: name:张三;age:20
    Integer result = list.stream().collect(Collectors.summingInt(Student::getAge));
    System.out.println("所有学生年龄之和 : " + reuslt);

    5,根据某字段对list进行分组

    List<Fruit> fruitList = Lists.newArrayList(new Fruit("apple", 6),new Fruit("apple", 6),
            new Fruit("banana", 7), new Fruit("banana", 7),
            new Fruit("banana", 7), new Fruit("grape",8));
    
    Map<String, List<Fruit>> groupMap = fruitList.stream().collect(Collectors.groupingBy(Fruit::getName));

    6,根据某字段对list进行分组并计数

    //输出结果是{banana=3, apple=2, grape=1}
    Map<String, Long> map = fruitList.stream().collect(Collectors.groupingBy(Fruit::getName,Collectors.counting()));

    7,根据字段排序

    //根据name字段倒排
    List<Fruit> list = fruitList.stream().sorted(Comparator.comparing(Fruit::getName).reversed()).collect(Collectors.toList());

    8,多条数据取第一条

    //equalsIgnoreCase:不考虑大小写;find.isPresent()可用来判断数据是否存在
    Optional<Fruit> find = fruitList.stream().filter(i -> i.getName().equalsIgnoreCase("apple")).findFirst();

    补充:

    1,List<EntityOld>转换为List<EntityNew>

    注意:实体类EntityNew中需要有一个EntityOld的转换方法

    EntityNew.java

    public class EntityNew {
        private String newId;
    
        private String avatar;
    
        //转换方法*
        public EntityNew (EntityOld item) {
            this.newId = item.getOldId() == null ? "" : item.getOldId();
        }
    
        public String getNewId() {
            return newId;
        }
    
        public void setNewId(String newId) {
            this.newId = newId;
        }
    
        public String getAvatar() {
            return avatar;
        }
    
        public void setAvatar(String avatar) {
            this.avatar = avatar;
        }
    }

    EntityOld.java

    public class EntityOld {
        private String oldId;
    
        private String oldName;
    
        public String getOldId() {
            return oldId;
        }
    
        public void setOldId(String oldId) {
            this.oldId = oldId;
        }
    
        public String getOldName() {
            return oldName;
        }
    
        public void setOldName(String oldName) {
            this.oldName = oldName;
        }
    }
  • 相关阅读:
    发布NBearV3最终测试版v3.2.5
    NBearV3教程——Web篇
    JUnit中的设计模式:命令模式
    HTTP协议 通信过程介绍
    JUnit中的设计模式:适配器模式
    《Head First设计模式》 读书笔记15 其余的模式(一) 桥接 生成器 责任链
    SQL基础:数据库规范化与三范式
    《Head First设计模式》 读书笔记13 复合模式 MVC模式
    Android Tab标签的使用基础
    Android设备上的传感器模拟工具:SensorSimulator
  • 原文地址:https://www.cnblogs.com/huashengweilong/p/10685416.html
Copyright © 2011-2022 走看看