0805strem流试炼--持续更新

89 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

//strem流试炼
@SpringBootTest
public class StreamTest {

    private  Logger logger  = LoggerFactory.getLogger(this.getClass());

    //一个接口中存放多个对象--一般用于一个entity实体类以外所有关的vo(值对象)、dto(数据传输对象)等对象都可以存放在一起(类少些了,也方便查询和删改)
    public interface  CollectionData{

        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        public class A{
            private Long id;
            private String name;
            private Long age;
            private String sex;

            public A(String name, Long age, String sex) {
                this.name = name;
                this.age = age;
                this.sex = sex;
            }
        }


        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        public class ADTO{
            private Long age;
            private String sex;
        }

    }
    //stream().forEach() 一般用于:遍历打印-也可以进行对象/单个列赋值
    @Test
    public void streamForEach(){
        ArrayList<CollectionData.A> aLists = new ArrayList<>();
        CollectionData.A a1 = new CollectionData.A("小明", 1l, "男");
        aLists.add(a1);
        //使用场景:如果是需要遍历打印一个列
        aLists.stream().forEach(f->{
            logger.info("打印age:{}",f.getAge());
            //打印age:1
        });
        //使用场景:如果是第一对象进行保存了,保存之后才会有id,此时,该id又是另外一个表的主键(一对多的关系),需要保存上述id作为关联id
        aLists.stream().forEach(f->{
            f.setId(1l);
        });

        logger.info("{}",aLists);
        //[StreamTest.A(id=1, name=小明, age=1, sex=男)]
    }

    //stream().filter() 一般用户过滤
    @Test
    public void streamFilter(){
        ArrayList<CollectionData.A> aLists = new ArrayList<>();
        CollectionData.A a1 = new CollectionData.A("小明", 1l, "男");
        CollectionData.A a2 = new CollectionData.A("小明2", 2l, "男2");
        CollectionData.A a3 = new CollectionData.A("小明3", 3l, "男3");
        aLists.add(a1);
        aLists.add(a2);
        aLists.add(a3);

        List<CollectionData.A> collect = aLists.stream().filter(f -> {
            if (f.getAge() > 1l) {
                return true;
            }
            return false;
        }).collect(Collectors.toList());

        logger.info("{}",collect);
        //[StreamTest.A(id=null, name=小明2, age=2, sex=男2), StreamTest.A(id=null, name=小明3, age=3, sex=男3)]
    }


    //stream().map() 一般用于重新映射需要的对象字段
    @Test
    public void streamMap(){
        ArrayList<CollectionData.A> aLists = new ArrayList<>();
        CollectionData.A a1 = new CollectionData.A("小明", 1l, "男");
        CollectionData.A a2 = new CollectionData.A("小明2", 2l, "男2");
        CollectionData.A a3 = new CollectionData.A("小明3", 3l, "男3");
        aLists.add(a1);
        aLists.add(a2);
        aLists.add(a3);


        //进行重新映射两个好处,
        //1、返回给前端需要的DTO,只放需要的字段,方便前端取,如果返回全部字段(前端不知道取哪个,需要口头阐述)
        //2、(sql查询的时候也需要此类返回-只取需要的字段-提高查询效率)

        List<CollectionData.ADTO> collect = aLists.stream().map(m -> {
            CollectionData.ADTO adto = new CollectionData.ADTO();
            adto.setAge(m.getAge());
            adto.setSex(m.getSex());
            return adto;
        }).collect(Collectors.toList());


        logger.info("{}",collect);
        //[StreamTest.CollectionData.ADTO(age=1, sex=男), StreamTest.CollectionData.ADTO(age=2, sex=男2), StreamTest.CollectionData.ADTO(age=3, sex=男3)]
    }
}