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());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值