Stream流操作集合常见用法

List转为Map<String, List>

一个键对应多个值
key为对象的其中一个值,value为key值对应的所有数据形成的列表

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("1", "001", "name1"));
        list.add(new User("2", "002", "name2"));
        list.add(new User("3", "003", "name3"));
        list.add(new User("3", "003", "name03"));
        list.add(new User("3", "003", "name03"));
        Map<String, List<User>> map = list
        .stream()
        .collect(Collectors.groupingBy(User::getCode));
        System.out.println(map);
    }

List转Map<String,Object>

一个键对应一个值
key值为对象的一个字段,value为对象

key值不重复

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("1", "001", "name1"));
        list.add(new User("2", "002", "name2"));
        list.add(new User("3", "003", "name3"));
        Map<String, User> map = list
        .stream()
        .collect(Collectors.toMap(User::getId, Function.identity()));
        System.out.println(map);
    }

注意:
这里的key不能重复,重复会报错

image.png

key值重复

如果key值可能会重复,使用以下方式:

保留第一个值
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("1", "001", "name1"));
        list.add(new User("2", "002", "name2"));
        list.add(new User("3", "003", "name3"));
        list.add(new User("3", "003", "name03"));
        list.add(new User("3", "003", "name003"));
        //如果id重复,保留现有的值
        Map<String, User> map = list
        .stream()
        .collect(Collectors.toMap(User::getId, Function.identity(), 
                                  (existing, replacement) -> existing));
        System.out.println(map);
    }
保留最新的值
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("1", "001", "name1"));
        list.add(new User("2", "002", "name2"));
        list.add(new User("3", "003", "name3"));
        list.add(new User("3", "003", "name03"));
        list.add(new User("3", "003", "name003"));
        //如果id重复,保留新的值
        Map<String, User> map = list
        .stream()
        .collect(Collectors.toMap(User::getId, Function.identity(),
                                  (existing, replacement) -> replacement));
        System.out.println(map);
    }

List转Map<String,String>

key为对象中的其中一个字段值,value为对象中的另一个字段值。
如:key为id,value为code值。

key值不重复

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("1", "001", "name1"));
        list.add(new User("2", "002", "name2"));
        list.add(new User("3", "003", "name3"));
        Map<String, String> map = list
        .stream()
        .collect(Collectors.toMap(User::getId, User::getCode));
    }

注意:使用这种方式,如果key值重复会报错

image.png

key值重复

保留第一个值
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("1", "001", "name1"));
        list.add(new User("2", "002", "name2"));
        list.add(new User("3", "003", "name3"));
        list.add(new User("3", "003", "name03"));
        list.add(new User("3", "003", "name003"));
        //如果id重复,保留现有的值
        Map<String, String> map = list
        .stream()
        .collect(Collectors.toMap(User::getId, User::getCode,
                                  (firstVal, lastVal) -> firstVal));
        System.out.println(map);
    }
保留最新的值
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("1", "001", "name1"));
        list.add(new User("2", "002", "name2"));
        list.add(new User("3", "003", "name3"));
        list.add(new User("3", "003", "name03"));
        list.add(new User("3", "003", "name003"));
        //如果id重复,保留新的值
        Map<String, String> map = list
        .stream()
        .collect(Collectors.toMap(User::getId, User::getCode,
                                  (firstVal, lastVal) -> lastVal));
        System.out.println(map);
    }

去除集合中的重复元素

    /**
     * 去除集合中的重复元素
     */
    private static void distinct() {
        List<String> list = Arrays.asList("a", "b", "a", "c");
        list = list.stream().distinct().collect(Collectors.toList());
        list.forEach(System.out::println);
    }

获取集合中的第一个元素

    /**
     * 获取集合中的第一个元素
     */
    private static void getFirst() {
        List<String> list = Arrays.asList("a", "b", "c");
        String first = list.stream().findFirst().get();
        System.out.println(first);
    }

检查是否存在满足条件的元素

    /**
     * 检查是否存在满足条件的元素
     */
    private static void anyMatch() {
        List<String> list = Arrays.asList("a", "b", "c");
        boolean anyMatch = list.stream().anyMatch(s -> s.equals("a"));
        System.out.println(anyMatch);
    }

检查是否所有元素都满足条件

    /**
     * 检查是否所有元素都满足条件
     */
    private static void allMatch() {
        List<String> list = Arrays.asList("a", "b", "c");
        boolean allMatch = list.stream().allMatch(s -> s.length() == 1);
        System.out.println(allMatch);
    }

检查是否所有元素都不满足条件

    /**
     * 检查是否所有元素都不满足条件
     */
    private static void noneMatch() {
        List<String> list = Arrays.asList("a", "b", "c");
        boolean noneMatch = list.stream().noneMatch(s -> s.length() > 1);
        System.out.println(noneMatch);
    }

排序

对基本类型排序

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 3, 7, 2, 8);
        List<Integer> sortedNumbers = numbers.stream()
            .sorted()
            .collect(Collectors.toList());
        // 输出: [2, 3, 5, 7, 8]
        System.out.println(sortedNumbers); 
    }
}

对自定义对象排序

根据对象的单个字段排序
正序排序
    /**
     * 对单个字段进行排序(正序)
     *
     * @param list 排序后的列表
     */
    private static void sort(List<User> list) {
        List<User> sortList = list
                .stream()
                .sorted(Comparator.comparing(User::getCode))
                .collect(Collectors.toList());
        sortList.forEach(System.out::println);
    }
倒序排序
    /**
     * 对单个字段进行排序(倒序)
     *
     * @param list 排序后的列表
     */
    private static void reverseSort(List<User> list) {
        List<User> sortList = list
                .stream()
                .sorted(Comparator.comparing(User::getCode).reversed())
                .collect(Collectors.toList());
        sortList.forEach(System.out::println);
    }
根据多个字段排序
    /**
     * 按照多字段进行排序
     * 1、先按照code倒序排序
     * 2、再按照name正序排序
     *
     * @param list
     */
    private static void sortMore(List<User> list) {
        List<User> sortList = list
                .stream()
                .sorted(Comparator.comparing(User::getCode).reversed()
                        .thenComparing(User::getName))
                .collect(Collectors.toList());
    }
### Java Stream 处理中的映射操作 JavaStream API 提供了一种高效且简洁的方式来进行集合的映射操作。通过 `map` 和 `flatMap` 方法可以轻松实现元素级别的换。 #### 使用 `map` 进行单个元素到另一个对象的映射 当需要将中的每一个元素都按照某种规则化为另一种形式的对象时,可以使用 `map` 函数。该函数接收一个参数——即当前正在被迭代的元素,并返回一个新的值作为化后的结果。 ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class MapExample { public static void main(String[] args) { List<String> strings = Arrays.asList("apple", "banana", "orange"); // 将字符串列表中的每个单词首字母大写化 List<String> capitalizedStrings = strings.stream() .map(str -> str.substring(0, 1).toUpperCase() + str.substring(1)) .collect(Collectors.toList()); System.out.println(capitalizedStrings); // 输出: [Apple, Banana, Orange] } } ``` 这种方法适用于一对一的关系,在这种情况下,输入中的每一项都会对应输出里的唯一一项[^2]。 #### 利用 `flatMap` 处理一对多的情况 对于某些场景下可能需要把一个元素展开成多个新元素加入到最终的结果集中,这时就可以采用 `flatMap` 方法来完成这样的需求。与普通的 `map` 不同的是,`flatMap` 可以接受一个返回类型为操作并将其扁平化合并回原中去。 ```java import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class FlatMapExample { public static void main(String[] args) { List<List<Integer>> listOfLists = new ArrayList<>(); listOfLists.add(Arrays.asList(1, 2)); listOfLists.add(Arrays.asList(3, 4)); // 展开嵌套列表成为单一整数列表 List<Integer> flattenedList = listOfLists.stream() .flatMap(List::stream) .collect(Collectors.toList()); System.out.println(flattenedList); // 输出: [1, 2, 3, 4] } } ``` 这里展示了如何利用 `flatMap` 把二维结构的数据展平为一维的形式[^4]。 #### 结合复杂业务逻辑进行映射 除了简单的属性提取外,还可以编写更复杂的表达式甚至自定义方法来进行更加灵活的数据变换: ```java class Student { private String name; private int age; // 构造器、getter/setter 省略... @Override public String toString() { return this.name + "(" + this.age + ")"; } public static Student createStudent(String dataString){ String[] parts = dataString.split(","); return new Student(parts[0], Integer.parseInt(parts[1])); } } // 假设有如下格式的学生信息字符串:"name,age" List<String> studentData = Arrays.asList( "Alice,21", "Bob,22", "Charlie,23"); // 解析这些字符串表示的学生记录并将它们换为实际的学生对象实例 List<Student> students = studentData.stream() .map(Student::createStudent) .collect(Collectors.toList()); System.out.println(students); // 输出类似于:[Alice(21), Bob(22), Charlie(23)] ``` 这段代码演示了怎样从原始数据构建新的实体模型,这在实际应用开发过程中非常常见[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值