Java 8-如何从另一个列表中的对象设置列表中的对象?

Java 8-如何从另一个列表中的对象设置列表中的对象?,java,java-8,functional-programming,java-stream,Java,Java 8,Functional Programming,Java Stream,我想了解如何将一个对象从一个列表复制/分配到另一个列表 例如:ClassA有一个classSample的对象,ClassB也有一个classSample的对象(如下面的示例所示,这两个类中的其他数据成员不同) 我有ClassA和ClassB的列表 现在,如果我想在列表的每个元素中用列表中的Sample对象的值设置类Sample的对象,我如何使用Java中的函数式来实现这一点 我已经展示了如何通过命令式风格来实现这一点,但是我真的想在这里使用流 假设:列表和列表的大小相等 这些是我的课程: 样

我想了解如何将一个对象从一个列表复制/分配到另一个列表

例如:ClassA有一个classSample的对象,ClassB也有一个classSample的对象(如下面的示例所示,这两个类中的其他数据成员不同)

我有ClassAClassB的列表

现在,如果我想在列表的每个元素中用列表中的Sample对象的值设置类Sample的对象,我如何使用Java中的函数式来实现这一点

我已经展示了如何通过命令式风格来实现这一点,但是我真的想在这里使用流


假设:列表
列表的大小相等


这些是我的课程:

样本:

class Sample {
    int a;
    String str;

    public Sample() {}

    public Sample(int a, String str) {
        this.a = a;
        this.str = str;
    }

    @Override
    public String toString() {
        return "Sample [a=" + a + ", str=" + str + "]";
    }
}
A类:

class ClassA {
    String someString;
    Sample sample;

    public ClassA(String someString, Sample sample) {
        this.someString = someString;
        this.sample = sample;
    }

    @Override
    public String toString() {
        return "ClassA [someString=" + someString + ", sample=" + sample + "]";
    }
}
B类:

class ClassB {
    int someNumber;
    int someOtherNumber;
    String someString;
    Sample sample;

    public ClassB(int someNumber, int someOtherNumber, String someString, Sample sample) {
        super();
        this.someNumber = someNumber;
        this.someOtherNumber = someOtherNumber;
        this.someString = someString;
        this.sample = sample;
    }

    @Override
    public String toString() {
        return "ClassB [someNumber=" + someNumber + ", someOtherNumber=" + someOtherNumber + ", someString="
                + someString + ", sample=" + sample + "]";
    }
}
最后是主要课程:

public class ClassC {
    public static void main(String args[]) {

        ClassA a1 = new ClassA("abc", new Sample(1, "abc"));
        ClassA a2 = new ClassA("def", new Sample(2, "abcde"));
        ClassA a3 = new ClassA("pqr", new Sample(3, "abcdf"));
        List<ClassA> listOfA = new ArrayList<>();
        listOfA.add(a1);
        listOfA.add(a2);
        listOfA.add(a3);
        System.out.println(listOfA);

        ClassB b1 = new ClassB(100, 200, "zmr", null);
        ClassB b2 = new ClassB(101, 201, "tpu", null);
        ClassB b3 = new ClassB(103, 203, "zzz", null);
        List<ClassB> listOfB = new ArrayList<>();
        listOfB.add(b1);
        listOfB.add(b2);
        listOfB.add(b3);
        System.out.println("before : " + listOfB);

        // how to do this using stream ?
        for(int i = 0; i < listOfB.size(); i++) {
            listOfB.get(i).sample = listOfA.get(i).sample;
        }

        System.out.println("after : " + listOfB);
    }
}
你们可以用功能性的方式来做,但老实说,两者都是一样的

IntStream.range(0, listOfB.size())
         .forEach(i -> listOfB.get(i).sample = listOfA.get(i).sample);

这里有另一种方法,使用原子整数(因此我们可以将其设置为final)循环遍历listB

   final AtomicInteger i= new AtomicInteger();
   listOfA.forEach( a-> listOfB.get(i.getAndIncrement()).sample = a.sample );
或者迭代器方式

   Iterator<ClassB> iter = listOfB.iterator(); 
   listOfA.forEach( a-> iter.next().sample = a.sample );
迭代器iter=listOfB.Iterator(); listOfA.forEach(a->iter.next().sample=a.sample);
   Iterator<ClassB> iter = listOfB.iterator(); 
   listOfA.forEach( a-> iter.next().sample = a.sample );