Java 转换列表<;T>;进入另一个列表<;配对<;五十、 R>&燃气轮机;

Java 转换列表<;T>;进入另一个列表<;配对<;五十、 R>&燃气轮机;,java,list,Java,List,将一个列表转换为另一个列表的最佳方法是什么(例如,以的形式将列表转换为另一个列表),如图所示: 如图所示,有一个源列表是List,它本质上包含一个UserModel和getUserId()方法,这个列表可以是空的,包含一个或多个元素),因此它是任意的。目标是创建另一个列表,其中将包含一对字符串用户ID 这里有一个代码来概述这个问题 List<UserModel> models= getUsers(); List<UserRenderModel> renderModel

将一个列表转换为另一个列表的最佳方法是什么(例如,以
的形式将列表转换为另一个列表
),如图所示:

如图所示,有一个源列表是
List
,它本质上包含一个
UserModel
getUserId()
方法,这个列表可以是空的,包含一个或多个元素),因此它是任意的。目标是创建另一个列表,其中将包含一对字符串用户ID

这里有一个代码来概述这个问题

List<UserModel> models= getUsers(); 
List<UserRenderModel> renderModels = new LinkedList<>();

        IntStream.range(0, models)
                .forEach(idx -> {
                            UserRenderModel renderModel = new UserRenderModel();
                            UserModel dataModel = models.get(idx);
                            if(idx % 2 == 0) {
                             renderModel.setLeftUserId(dataModel.getUserId());
                            } else {
                             renderModel.setRightUserId(dataModel.getUserId());
                            }
                            renderModels.add(renderModel);
                        }
                );
List models=getUsers();
List renderModels=new LinkedList();
IntStream.range(0,型号)
.forEach(idx->{
UserRenderModel renderModel=新的UserRenderModel();
UserModel dataModel=models.get(idx);
如果(idx%2==0){
renderModel.setLeftUserId(dataModel.getUserId());
}否则{
renderModel.setRightUserId(dataModel.getUserId());
}
添加(renderModel);
}
);

在这段代码中,您可以看到,如果集合中有一个带有两个对象的
UserModel
,它将创建两个
UserRenderModel
,这将添加到renderModels集合中,这是错误的,然而,它应该只是一个
UserRenderModel
,您没有提供太多关于
UserModel
UserRenderModel
类的详细信息,但我们假设您有一些方法可以将一个转换为另一个:

private static UserRednerModel toRenderModel(UserModel u) {
    // pseudocode, of course:
    String leftUserId = getLeftIdFromId(u.getId());
    String RIGHTUserId = getRightIdFromId(u.getId());

    return new UserRenderModel(leftUserId, rightUserId);
}
有了这样一种方法,我会将
UserModel
s的列表流化,将每个列表映射到一个
UserRenderModel
,并将其收集到一个新列表中:

List<UserModel> myList = ...;
List<UserRenderModel> result = 
    myList.stream()
          .map(SomeClass::toRenderModel)
          .collect(Collectors.toList());
List myList=。。。;
列表结果=
myList.stream()
.map(SomeClass::toRenderModel)
.collect(Collectors.toList());
解决方案是

IntStream.range(0, models.size())
            .filter(idx -> idx % 2 == 0)
            .forEach(idx -> {
                UserModel userModel1 = models.get(idx);
                UserModel userModel2 = idx + 1 < models.size() ? models.get(idx + 1) : null;
                UserRenderModel renderModel = new UserRenderModel();
                renderModel.setLeftUserId(userModel1.getUserId());
                renderModel.setRightUserId(userModel2.getUserId());
            });
IntStream.range(0,models.size())
.filter(idx->idx%2==0)
.forEach(idx->{
UserModel userModel1=models.get(idx);
UserModel userModel2=idx+1
通常的方法是
List#stream
stream#map
,最后是
stream#collect
使用
collector#toList
UserModel
UserRenderModel
之间的关系是什么?是一对一、成对、滑动窗口还是其他方法?问题更新@PatrickHaugh