Java List对象转为对象中某个属性的List 并且互转

本文介绍如何利用JDK8的Stream API进行对象与对象某个属性之间的转换,包括使用map和flatMap操作,以实现对象列表转换为对应属性ID的列表,减少重复代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

经常会遇到将对象列表转换为对应的对象ID的列表,而且又讨厌写重复的代码。下面我们将用Jdk8的stream来实现这个功能

对象转对象的某个属性

最重要还是利用了stream的map函数

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

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

@Slf4j
public class Test {
    @org.junit.jupiter.api.Test
    void test(){
        List<TestUser> list = new ArrayList<>();
        list.add(TestUser.builder().name("杨过").id(1).build());
        list.add(TestUser.builder().name("小龙女").id(2).build());
        List<Integer> ids = list.stream()
	        .map(TestUser::getId)
	        .collect(Collectors.toList());
        log.info("ids:{}",ids);
    }

    @Getter
    @Setter
    @Builder
    public static class TestUser{
        private String name;
        private Integer id;
    }
}

关于stream()的map

本质上它是对数据流的一种映射关系定义,相当于它内部有自己的迭代器遍历,我们只需要在map中传入处理逻辑即可,map的输入是输入流的一个数据单元,输出可以是任意的。因此我们以后涉及到数据流映射的时候,都可以用它.

对象某个属性转对象

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

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

@Slf4j
public class Test {
    @org.junit.jupiter.api.Test
    void test(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        List<TestUser> userList = list.stream()
	        .map(k->TestUser.builder().id(k).build())
	        .collect(Collectors.toList());
    }

    @Getter
    @Setter
    @Builder
    public static class TestUser{
        private String name;
        private Integer id;
    }
}

关于stream()的flatmap

flatmap与map非常类似,不过我们从字面意思来理解,map表示映射flat表示平,展开所以我们从命名可以这么理解,flatmap表示,将stream流中的所有子stream流合并。

示例代码

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.util.*;
import java.util.stream.Collectors;

@Slf4j
public class Test {
    @org.junit.jupiter.api.Test
    void test(){
        Map<Integer,List<TestUser>> map = new HashMap<>();
        List<TestUser> list = new ArrayList<>();
        list.add(TestUser.builder().name("杨过").id(1).build());
        list.add(TestUser.builder().name("小龙女").id(2).build());
        map.put(1,list);
        map.put(2,list);
        List<TestUser> userList = map.values().stream()
                .flatMap(Collection::stream)
                .collect(Collectors.toList());
        //user size:4,每个stream被合并
        log.info("user size:{}",userList.size());
    }

    @Getter
    @Setter
    @Builder
    public static class TestUser{
        private String name;
        private Integer id;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值