两个list合并成一个对象

节操
  • 27

有name和class两个数组,长度相同,分别取name和class相同下标的值赋给一个对象属性的值。
比如说对象user

class User{
  private name;
  private class;
}

name[0]和class[0]组成一个User
怎么把这两个list<string>合并成一个list<User>。我知道使用for循环可以,还有什么优雅的写法吗?比如说使用流操作?

回复
阅读 400
1 个回答

你好,我来解答一下奥。
其实问题的关键就在于以下几点:

  • 如何遍历?因为两个数组的长度一致(下标对齐),所以遍历任意一个数组,用其当前下标即可,而由于在stream中获取list下标有点复杂,故采用IntStream.range的方法。
  • 如何组合成新的User对象? mapToObj方法可以做到这一点。
  • 如何收集User对象?lambda中是有收集器的。Collectors.toList()

这样就能实现你的需求了。

package lambda;

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

/**
 * @Author: Beer Bear
 * @Description: 来自思否
 * @Date: 2021/10/8 8:12
 */
public class NameAndClassFromSegmentfault {
    class User{
        private String oneClass;
        private Integer user;

        public User(String oneClass,Integer user){
            this.oneClass = oneClass;
            this.user = user;
        }

        @Override
        public String toString() {
            return "User{" +
                    "oneClass='" + oneClass + '\'' +
                    ", user=" + user +
                    '}';
        }
    }
    /**
     * create by: Beer Bear
     * description: 不放在main种是因为main是静态的 lambda无法从静态上下文中引用非静态方法
     * create time: 2021/10/8 8:28
     */
    public List<User> func() {
        List<Integer> names = Arrays.asList(1,2,3,4);
        List<String> classes = Arrays.asList("A","B","C","D");
        return IntStream.range(0,names.size()).mapToObj(x -> new User(classes.get(x), names.get(x))).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        NameAndClassFromSegmentfault nameAndClassFromSegmentfault = new NameAndClassFromSegmentfault();
        System.out.println(nameAndClassFromSegmentfault.func());
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏