【问题标题】:Java 8 - How to set an object in a list from an object in another list?Java 8 - 如何从另一个列表中的对象设置列表中的对象?
【发布时间】:2020-08-06 01:52:54
【问题描述】:

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

例如:ClassA有一个Sample类的对象,ClassB也有一个Sample类的对象(您可以在下面的示例中看到这两个类中的其他数据成员不同)。

我有 ClassAClassB 的列表。

现在,如果我想用 Sample 对象的值在 List 的每个元素中设置类 Sample 的对象来自 List,我如何在 Java 中使用 Functional Style 做到这一点?

我已经展示了如何通过 Imperative Style 来完成,但我真的想在这里使用 streams


假设: ListList 的大小相等


这些是我的课程:

示例:

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);
    }
}

输出:

[ClassA [someString=abc, sample=Sample [a=1, str=abc]], ClassA [someString=def, sample=Sample [a=2, str=abcde]], ClassA [someString=pqr, sample=Sample [a=3, str=abcdf]]]

before : [ClassB [someNumber=100, someOtherNumber=200, someString=zmr, sample=null], ClassB [someNumber=101, someOtherNumber=201, someString=tpu, sample=null], ClassB [someNumber=103, someOtherNumber=203, someString=zzz, sample=null]]

after : [ClassB [someNumber=100, someOtherNumber=200, someString=zmr, sample=Sample [a=1, str=abc]], ClassB [someNumber=101, someOtherNumber=201, someString=tpu, sample=Sample [a=2, str=abcde]], ClassB [someNumber=103, someOtherNumber=203, someString=zzz, sample=Sample [a=3, str=abcdf]]]

【问题讨论】:

    标签: java java-8 functional-programming java-stream


    【解决方案1】:

    您可以使用IntStream 以功能的方式做到这一点,但老实说两者是相同的

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

    【讨论】:

      【解决方案2】:

      这是另一种方式,使用 AtomicInteger(因此我们可以将其设为 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 );
      

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 2019-06-18
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多