1. 对比两List集合数据某些字段一样的情况下取值:
一般简单方式我们会使用双重for循环来处理判断数据取值(如下代码所示),但是数据量越大的情况下代码效率则越低,并且现在很多公司都会限制for循环层数所以更推荐stream将List转换为Map通过key取值
普通方式:
for (DashboardsDO aDo : dashboardsDOS) {
for (Target target : targetList) {
if (aDo.getStoreCode().equals(target.getStoreCode())) {
代码逻辑等等
}
}
}
stream:
List<Student> list1= new ArrayList<>();
List<StudentMSG> list2= new ArrayList<>();
// 假设以上两个list都有数据我们通过学生姓名name与学号num进行取值
Map<String, StudentMSG> studentMap=list2.stream()
.collect(Collectors.toMap(studentMSG-> studentMSG.getName() + "_" + studentMSG.getNum(), Function.identity()));
// 此时我们将name与num作为map的key,值为当前实体类
list1 = list1.stream()
.map(student-> {
// 将list1的name与num作为key
String key = student.getName() + "_" + student.getNum();
// 通过key取值
StudentMSG studentMSG = studentMap.get(key);
// 你的业务逻辑
return student;
}).collect(Collectors.toList());
2. Stream流过滤出偶数并求和
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 使用Stream流过滤出偶数并求和
int sumOfEvenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println("Sum of even numbers: " + sumOfEvenNumbers);
3. Stream流将数字转换为字符串并连接成一个字符串
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 使用Stream流将数字转换为字符串并连接成一个字符串
String joinedNumbers = numbers.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
System.out.println("Joined numbers: " + joinedNumbers);
4. Stream根据集合某字段进行排序
List<Person> people = new ArrayList<>();
people.add(new Person("张三", 30));
people.add(new Person("李四", 25));
people.add(new Person("王五", 35));
// 根据age字段排序
List<Person> sortedPeople = people.stream()
.sorted(Comparator.comparingInt(Person::getAge))
.collect(Collectors.toList());
sortedPeople.forEach(person -> System.out.println(person.getName() + ": " + person.getAge()));
5. Stream根据某字段过滤
List<Person> people = new ArrayList<>();
people.add(new Person("张三", 20));
people.add(new Person("李四", 15));
people.add(new Person("王五", 25));
// 过滤年龄大于18岁的人
List<Person> adults = people.stream()
.filter(person -> person.getAge() >= 18)
.collect(Collectors.toList());
adults.forEach(person -> System.out.println(person.getName() + ": " + person.getAge()));
6. Stream去重
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 1, 2, 3);
List<Integer> distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());
7. Stream两个list根据某相同字段去重
List<MyClass> list1 = new ArrayList<>();
list1.add(new MyClass("A"));
list1.add(new MyClass("B"));
list1.add(new MyClass("C"));
List<MyClass> list2 = new ArrayList<>();
list2.add(new MyClass("B"));
list2.add(new MyClass("C"));
list2.add(new MyClass("D"));
// 根据field字段去重
List<MyClass> result = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
for (MyClass item : result) {
System.out.println(item.getField());
}
8. 映射函数
List<String> strings = Arrays.asList("apple", "banana", "cherry");
List<Integer> lengths = strings.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths); // 输出 [5, 6, 6]
9. 对元素进行排序
List<String> strings = Arrays.asList("apple", "banana", "cherry", "date");
List<String> sortedStrings = strings.stream()
.sorted((s1, s2) -> Integer.compare(s1.length(), s2.length()))
.collect(Collectors.toList());
System.out.println(sortedStrings); // 输出 [date, apple, cherry, banana]