java8 常用集合操作学习
1 创建两个实体类
import java.math.BigDecimal;
@ToString
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int age;
private String name;
private BigDecimal money;
}
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
private int age;
private String name;
}
2 使用
public class Test {
public static void main(String[] args) {
List<Student> personList = new ArrayList<>(5);
personList.add(new Student(10, "张三", new BigDecimal(100)));
personList.add(new Student(20, "李四", new BigDecimal(100)));
personList.add(new Student(30, "王五", new BigDecimal(100)));
personList.add(new Student(15, "孙悟空", new BigDecimal(100)));
personList.add(new Student(25, "猪八戒", new BigDecimal(100)));
//filter 条件过滤
personList.stream().filter(s -> s.getAge() > 20).forEach(System.out::println);
//映射元素,取属性值
List<String> list2 = personList.stream().map(s -> s.getName()).collect(Collectors.toList());
Set<String> set = personList.stream().map(Student::getName).collect(Collectors.toSet());
//skip 跳过前 n 个元素 , limit 返回前面 n 个元素;
personList.stream().skip(1).limit(2).forEach(System.out::println);
//转map 取name作为key,age作为value
Map<String, Integer> map = personList.stream().collect(Collectors.toMap(Student::getName, Student::getAge));
//转map 取name作为key,实体对象作为value
Map<String, Student> map2 = personList.stream().collect(Collectors.toMap(Student::getName, stu -> stu));
//或者
personList.stream().collect(Collectors.toMap(Student::getName, Function.identity()))
.forEach((k,v)->System.err.println(k+"-"+v));
//注意:toMap 如果集合对象有重复的key,会报错 Duplicate key ....
// 可以用 (key1,key2)->key2 来设置,如果有重复,则保留key2,舍弃key1
Map<String, Student> map6 = personList.stream().
collect(Collectors.toMap(Student::getName, Function.identity(), (k1, k2) -> k2));
//对象转换 student->teacher
List<Teacher> teachers = personList.stream().map(student ->
new Teacher(student.getAge(), student.getName())).collect(Collectors.toList());
//按年龄进行分组
Map<Integer, List<Student>> map4 = personList.stream().collect(Collectors.groupingBy(Student::getAge));
//将集合中的数据按照某个属性求和:
Integer totalAge = personList.stream().map(Student::getAge).reduce(Integer::sum).get();
//或者
Integer totalAge2 = personList.stream().mapToInt(Student::getAge).sum();
//拼接属性
personList.stream().map(Student::getName).collect(Collectors.joining("-"));
// 根据属性去重
personList.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getAge))), ArrayList::new)
).forEach(System.out::println);
//属性排序
personList.stream().sorted(Comparator.comparingInt(Student::getAge)).collect(Collectors.toList()).forEach(System.out::println);
//属性排序 反序
personList.stream().sorted(Comparator.comparingInt(Student::getAge).reversed()).collect(Collectors.toList()).forEach(System.out::println);
}
}