分组(多字段分组):

  1. Map<String,List<Fruit>> fruitMap = fruitList.stream().collect(Collectors.groupingBy(Fruit::getName));
  2. Map<String, List<CalbPrOutputSum>> map = outputSums.stream().collect(Collectors.groupingBy(t -> t.getModelNum()));
  3. Map<String, List<WorkPlanVo>> collect = value.stream().collect(Collectors.groupingBy(a -> MessageFormat.format("{0}#{1}#{2}#{3}#{4}", a.getWorkshop(),
  4. a.getProjectCode(), a.getProdLineCode(), a.getModelCode(), a.getOutputOp())));

使用年龄进行升序排序:

  1. List<StudentInfo> studentsSortName = studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge)).collect(Collectors.toList());

使用年龄进行降序排序(使用reversed()方法):

  1. List<StudentInfo> studentsSortName = studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge).reversed()).collect(Collectors.toList());

使用年龄进行降序排序,年龄相同再使用身高升序排序:

  1. List<StudentInfo> studentsSortName = studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge).reversed()
  2. .thenComparing(StudentInfo::getHeight)).collect(Collectors.toList());

排序,改变原来的集合

  1. personList.sort(Comparator.comparing(Person::getAge)); // 正序
  2. personList.sort(Comparator.comparing(Person::getAge).reversed()); // 倒序

过滤

  1. List<Employee> employees = new ArrayList<Employee>();
  2. employees.addAll(Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10));
  3. Optional<Employee> first = employees.stream().filter(t -> "M".equals(t.getGender())).findFirst();
  4. List<Employee> collect = employees.stream().filter(t -> "M".equals(t.getGender())).collect(Collectors.toList());
  5. List<Employee> collect1 = employees.stream().filter(t -> "M".equals(t.getGender()))
  6. .filter(t -> "Ricky".equals(t.getFirstName())).collect(Collectors.toList());

去重后的size

  1. dtos.stream().distinct().count()

在使用Collectors.groupingBy分组时,如果分组的字段中有值为null,会抛出空指针异常

  1. class Stu {
  2. String age;
  3. String sex;
  4. }
  5. @Test
  6. void test1() {
  7. List<Stu> objects = new ArrayList<>();
  8. objects = Arrays.asList(new Stu("18", null), new Stu("19", "男"), new Stu("17", "女"));
  9. Map<String, List<Stu>> collect = objects.stream().collect(Collectors.groupingBy(x -> x.getSex()));
  10. System.out.println(collect);
  11. }
  12. //输出:java.lang.NullPointerException: element cannot be mapped to a null key

解决办法:

  1. @Test
  2. public void test4() {
  3. List<Stu> objects = new ArrayList<>();
  4. objects = Arrays.asList(new Stu("18", null), new Stu("19", "男"), new Stu("17", "女"));
  5. Map<Optional<String>, List<Stu>> collect = objects.stream().collect(Collectors.groupingBy(x -> Optional.ofNullable(x.getSex())));
  6. System.out.println(collect);
  7. List<Stu> finalList = new ArrayList<>();
  8. for (Map.Entry<Optional<String>, List<Stu>> optionalListEntry : collect.entrySet()) {
  9. if (optionalListEntry.getKey().isPresent()) {
  10. finalList.addAll(optionalListEntry.getValue());
  11. }
  12. }
  13. System.out.println(finalList);
  14. }
  15. // 输出: {Optional.empty=[Stu{age='18', sex='null'}], Optional[女]=[Stu{age='17', sex='女'}], Optional[男]=[Stu{age='19', sex='男'}]}
  16. // [Stu{age='17', sex='女'}, Stu{age='19', sex='男'}]

java8 Stream 取出两个list中相同部分

  1. List l = (List)list.stream().filter(it->list2.contains(it)).collect(Collectors.toList());

获取年龄最大/最小的Person

  1. Person maxAgePerson = personList.stream().max(Comparator.comparing(Person::getAge)).get();
  2. long asLong = list.stream().mapToLong(User::getAge).max().getAsLong();
  3. Person minAgePerson = personList.stream().min(Comparator.comparing(Person::getAge)).get();
  4. long asLong1 = list.stream().mapToLong(User::getAge).min().getAsLong();

统计出年龄等于20的个数

  1. long count = personList.stream().filter(person -> person.getAge() == 20).count();

获得年龄的平均值

  1. double asDouble = personList.stream().mapToInt(person -> person.getAge()).average().getAsDouble();

获得年龄的求和

  1. int sum = personList.stream().mapToInt(person -> person.getAge()).sum();
  2. int sum = list.stream().reduce(0, (acc, value) -> acc + value);
  1. // 将名称积累到一个树集
  2. Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
  3. // 将元素转换为字符串,并用逗号分隔
  4. String joined = things.stream()
  5. .map(Object::toString)
  6. .collect(Collectors.joining(", "));
  7. // 计算员工工资总额
  8. int total = employees.stream()
  9. .collect(Collectors.summingInt(Employee::getSalary)));
  10. // 按部门计算工资总额
  11. Map<Department, Integer> totalByDept
  12. = employees.stream()
  13. .collect(Collectors.groupingBy(Employee::getDepartment,
  14. Collectors.summingInt(Employee::getSalary)));
  15. // 把学生分成及格和不及格
  16. Map<Boolean, List<Student>> passingFailing =
  17. students.stream()
  18. .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));
  19. // 找出集合李重复元素个数大于2的
  20. List<String> list = Arrays.asList("aaa","aaa","ccc","aaa","bbb","bbb","ddd","ddd","ddd","ddd");
  21. List<String> collect = list.stream()
  22. .collect(Collectors.toMap(e-> {
  23. return e;
  24. }, e -> 1, (a, b) -> {
  25. return a + b;
  26. })) // 获得元素出现频率的 Map,键为元素,值为元素出现的次数
  27. .entrySet().stream() // Set<Entry>转换为Stream<Entry>
  28. .filter(entry -> entry.getValue() > 2) // 过滤出元素出现次数大于 1 的 entry
  29. .map(entry -> entry.getKey()) // 获得 entry 的键(重复元素)对应的 Stream
  30. .collect(Collectors.toList());


Java8新特性Stream之list转map及问题解决
1.Java8 使用 stream().map()提取List对象的某一列值及排重

  1. @Test
  2. void contextLoads0() {
  3. ArrayList<Product> products = new ArrayList<>();
  4. products.add(new Product(1,"name1","location1"));
  5. products.add(new Product(2,"name2","location2"));
  6. products.add(new Product(3,"name3","location3"));
  7. List<String> collect = products.stream().map(Product::getName).collect(Collectors.toList());
  8. //products.stream().map(t -> t.getName()).collect(Collectors.toList());
  9. System.out.println(collect);
  10. }
  11. 输出:[name1, name2, name3]
  12. 排重:List<Integer> ageList = studentList.stream().map(StudentInfo::getAge).distinct().collect(Collectors.toList());

2. List集合转Map

  1. @Test
  2. void contextLoad1() {
  3. ArrayList<Product> products = new ArrayList<>();
  4. products.add(new Product(1,"name1","location1"));
  5. products.add(new Product(2,"name2","location2"));
  6. products.add(new Product(3,"name3","location3"));
  7. Map<Integer, String> collect = products.stream().collect(Collectors.toMap(Product::getId, Product::getName));
  8. System.out.println(collect);
  9. }
  10. 输出:{1=name1, 2=name2, 3=name3}

3. key重复时用后面的value 覆盖前面的value

  1. @Test
  2. void contextLoad2() {
  3. ArrayList<Product> products = new ArrayList<>();
  4. products.add(new Product(1,"name1","location1"));
  5. products.add(new Product(1,"name2","location2"));
  6. products.add(new Product(3,"name3","location3"));
  7. Map<Integer, String> collect = products.stream().collect(Collectors.toMap(Product::getId, Product::getName,(k1,k2)->k2));
  8. System.out.println(collect);
  9. }
  10. 输出:{1=name2, 3=name3}

4. 重复时将前面的value和后面的value逗号拼接起来

  1. @Test
  2. void contextLoad3() {
  3. ArrayList<Product> products = new ArrayList<>();
  4. products.add(new Product(1,"name1","location1"));
  5. products.add(new Product(1,"name2","location2"));
  6. products.add(new Product(3,"name3","location3"));
  7. Map<Integer, String> collect = products.stream()
  8. .collect(Collectors.toMap(Product::getId, Product::getName,(k1,k2)->k1 + "," + k2));
  9. System.out.println(collect);
  10. }
  11. 输出:{1=name1,name2, 3=name3}

5.重复时将重复value的数据组成集合

  1. @Test
  2. void contextLoad4() {
  3. ArrayList<Product> products = new ArrayList<>();
  4. products.add(new Product(1,"name1","location1"));
  5. products.add(new Product(1,"name2","location2"));
  6. products.add(new Product(3,"name3","location3"));
  7. Map<Integer, List<String>> collect = products.stream().collect(Collectors.toMap(Product::getId,
  8. p -> {
  9. List<String> NameList = new ArrayList<>();
  10. NameList.add(p.getName());
  11. return NameList;
  12. },
  13. (List<String> value1, List<String> value2) -> {
  14. value1.addAll(value2);
  15. return value1;
  16. }
  17. ));
  18. System.out.println(collect);
  19. }
  20. 输出:{1=[name1, name2], 3=[name3]}

6. value为null时会出现NullPointerException
解决办法:设置时加判断如果是null,则设置成一个特定值

  1. Map<String,String> resultMap = list.stream().collect(Collectors.toMap(Student::getId, t -> t.getName()==null ? "":t.getName()));