List<User>和List<Map>转Map

背景

从数据库或第三方数据源查询出数据是List格式的,但是我们有时候为了判断一个元素在不在集合中,为了效率,就需要转换成Map去判断,毕竟O(1)还是很香的。

事例

User实体类

@Data
class User{
    private String id;
    private String name;
    private String age;
}

1. List<User> 转为Map<String, User>

将list集合转为key为id,value为user对象的map,key有重复则保留先前的

public static void main(String[] args) {
        List<User> list = new ArrayList<>(3);
        User user1 = User.builder().id("1").name("laowang").age(18).build();
        User user2 = User.builder().id("2").name("lisi").age(18).build();
        User user3 = User.builder().id("3").name("zhangsan").age(18).build();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        System.out.println(list); // [User(id=1, name=laowang, age=18), User(id=2, name=lisi, age=18), User(id=3, name=zhangsan, age=18)]
        Map<String, User> id2UserMap = list.stream().collect(Collectors.toMap(User::getId, obj -> obj, (k1, k2) -> k1));
        System.out.println(id2UserMap); //{1=User(id=1, name=laowang, age=18), 2=User(id=2, name=lisi, age=18), 3=User(id=3, name=zhangsan, age=18)}
    }

2. List<User> 转为Map<String,String>

将list集合转为key为id,value为name的map,key有重复则保留先前的

public static void main(String[] args) {
        List<User> list = new ArrayList<>(3);
        User user1 = User.builder().id("1").name("laowang").age(18).build();
        User user2 = User.builder().id("2").name("lisi").age(18).build();
        User user3 = User.builder().id("3").name("zhangsan").age(18).build();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        System.out.println(list); // [User(id=1, name=laowang, age=18), User(id=2, name=lisi, age=18), User(id=3, name=zhangsan, age=18)]
        Map<String, String> id2NameMap = list.stream().collect(Collectors.toMap(User::getId, User::getName, (k1, k2) -> k1));
        System.out.println(id2NameMap); //{1=laowang, 2=lisi, 3=zhangsan}
    }

3. List<Map<String,String> 转为 Map<String,String>

有时候我们list存放的不是对象,而是一个个map,只要是一类map我们就可以当作对象来处理。

public static void main(String[] args) {
        List<Map<String, String>> list = new ArrayList<>(3);
        Map<String, String> map1 = new HashMap<>();
        map1.put("id", "11");
        map1.put("name","laowang");
        Map<String, String> map2 = new HashMap<>();
        map2.put("id", "22");
        map2.put("name","lisi");
        Map<String, String> map3 = new HashMap<>();
        map3.put("id", "33");
        map3.put("name","zhangsan");
        list.add(map1);
        list.add(map2);
        list.add(map3);
        System.out.println(list); //[{name=laowang, id=11}, {name=lisi, id=22}, {name=zhangsan, id=33}]

        Map<String, String> id2NameMap = list.stream().collect(Collectors.toMap(obj -> obj.get("id"), obj -> obj.get("name"), (k1, k2) -> k1));
        System.out.println(id2NameMap); //{33=zhangsan, 22=lisi, 11=laowang}
    }

4. List<Map<String,String>> 打平为一个Map<String,String>

有时候我们有一个list集合,里面的map存放有不同的字段,我们想把他们合并到一个map中,就可以利用 flatMap

public static void main(String[] args) {
        List<Map<String, String>> list = new ArrayList<>(3);
        Map<String, String> map1 = new HashMap<>();
        map1.put("id", "11");
        map1.put("name","laowang");
        Map<String, String> map2 = new HashMap<>();
        map2.put("id", "22");
        map2.put("address","beijing");
        Map<String, String> map3 = new HashMap<>();
        map3.put("uuid", "33-33");
        list.add(map1);
        list.add(map2);
        list.add(map3);
        System.out.println(list);  //[{name=laowang, id=11}, {address=beijing, id=22}, {uuid=33-33}]

        // 方式一打平
        Map<String, String> collect = list.stream().map(Map::entrySet).flatMap(Set::stream).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (k1, k2) -> k1));
        System.out.println(collect); //{address=beijing, name=laowang, id=11, uuid=33-33}

        // 方式二打平
        Map<String, String> collect1 = list.stream().flatMap(obj -> obj.entrySet().stream()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (k1, k2) -> k1));
        System.out.println(collect1); //{address=beijing, name=laowang, id=11, uuid=33-33}
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
thrift-generator 是通过 Java 的接口生成 thrift 文件的工具。例子:public interface ICommonUserService {     public User login(int id, String name);     public User getUserById(long id);     public boolean saveUser(User user);     public List getUserIds(long id);      public Map getUserByIds(List ids);     public Map<String, List> getUsersByName(List names);     public Map<Long, List> getGroupUsers(List names, List userListList lns, long ll);     public List testCase1(Map num1, List num2, List num3, long num4, String num5); } public class ThriftStructBuilderTest {     private ThriftFileBuilder fileBuilder = new ThriftFileBuilder();     @Test     public void toOutputstream() throws Exception {         this.fileBuilder.buildToOutputStream(ICommonUserService.class, System.out);     } }执行代码:mvn test -Dtest=com.sohu.thrift.generator.builder.ThriftStructBuilderTest之后控制台输出如下:namespace java com.sohu.thrift.generator.test.thrift     enum Status {             NORMAL = 0,             BLOCKED = 1     }     struct Account {             1:i32 id,             2:string name     }     struct User {             1:i32 id,             2:string name,             3:bool sex,             4:Status status,             5:list ids,             6:Account account     }     service ICommonUserService {             User login(1:i32 arg0,2:string arg1),             map<string, list> getUsersByName(1:list arg0),             bool saveUser(1:User arg0),             map getUserByIds(1:list arg0),             list getUserIds(1:i64 arg0),             map<i64, list> getGroupUsers(1:list arg0,2:list arg1,3:list arg2,4:i64 arg3),             User getUserById(1:i64 arg0),             list testCase1(1:map arg0,2:list arg1,3:list arg2,4:i64 arg3,5:string arg4)     }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值