stream流及lambda的简单用法

stream流的注意点

	1、map用法中key跟value不可以为null, key为null需要用toMap
	2、map用法中不可以有重复的key,会报错
	3、stream写法中局部代码块的数据与外部方法中的变量不互通
	4、jdk8版本中map用法value不可以为null, 因为流中用到了hashmap的merge方法, 该方法对value做了非空判断

实体类

Student
import lombok.Data;

@Data
public class Student {
    private String id;
    private String name;
    private Integer age;
}
StudentDTO
import lombok.Data;

@Data
public class StudentDTO {
    private String id;
    private String name;
}

演示代码及测试

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Demo {
    public static void main(String[] args) {
        List<Student> studentList = getList();
        // 流的形式循环操作list
        studentList.forEach(student -> {
            System.out.println(student.getAge());
            student.setName("aaa");
        });

        // 获取对象列表中指定的列表 写法一
        List<String> idList1 = studentList.stream().map(student -> {
            return student.getId();
        }).collect(Collectors.toList());

        // 获取对象列表中指定的列表 写法二
        List<String> idList = studentList.stream().map(Student::getId).collect(Collectors.toList());

        // 对象列表中的指定两个字段返回为Map类型 写法一
        Map<String, Integer> collect = studentList.stream().collect(Collectors.toMap(Student::getId, Student::getAge));
        System.out.println(collect);
        
		// 对象列表中的指定两个字段返回为Map类型 写法二
        HashMap<String, String> collect1 = studentList.stream().collect(HashMap::new, (m, v) -> m.put(v.getId(), v.getName()), HashMap::putAll);

        // 将对象列表中转换成key为对象主键,value为对象的map
        Map<String, Student> studentMap = studentList.stream().collect(Collectors.toMap(Student::getId, Function.identity()));
        System.out.println(studentMap);

        // 返回对象列表中的指定字段并封装到指定对象
        List<StudentDTO> studentDTOList = studentList.stream().map(student -> {
            StudentDTO studentDTO = new StudentDTO();
            studentDTO.setId(student.getId());
            studentDTO.setName(student.getName());
            // BeanUtils.copyProperties(student,studentDTO);
            return studentDTO;
        }).collect(Collectors.toList());
        System.out.println(studentDTOList);

		// 根据id分组返回Map,key:id,value:List<Student>
		Map<String,List<Student>> map = studentList.stream().collect(Collectors.groupingBy(data -> data.getId());
		// 根据id分组返回map,key:id,value:List<String> nameList
		Map<String,List<String>> map1 = studentList.stream().collect(Collectors.groupingBy(Student::getId
                , Collectors.mapping(Student::getName, Collectors.toList())));
        // 过滤名称为1的学生,返回学生列表
        List<Student> filterStudentList = studentList .stream().filter(student-> student.getName().equals("1")).collect(Collectors.toList());
        // 过滤名称为1的学生,返回学生id列表
        List<String> filterIdList = studentList .stream().filter(student-> student.getName().equals("1")).map(Student::getId).collect(Collectors.toList());
    }

	// 造数据
    private static List<Student> getList() {
        Student student1 = getStudent("1", "1", 1);
        Student student2 = getStudent("2", "2", 2);
        Student student3 = getStudent("3", "3", 3);
        Student student4 = getStudent("4", "4", 4);
        Student student5 = getStudent("5", "5", 3);
        List<Student> list = new ArrayList<>();
        list.add(student1);
        list.add(student2);
        list.add(student3);
        list.add(student4);
        list.add(student5);
        return list;
    }
	// 获取对象(可以用全参构造)
    private static Student getStudent(String id, String name, Integer age) {
        Student student = new Student();
        student.setId(id);
        student.setAge(age);
        student.setName(name);
        return student;
    }
}
持续学习中。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值