Итерирование списка CustomObject, фильтрация с условием и заданный атрибут c Атрибут - PullRequest
0 голосов
/ 23 апреля 2020

У меня проблема с фильтрами и сеттером, как указано ниже.

У меня есть свой пользовательский класс A, и у меня есть список A как list , Я хочу перебрать список и отфильтровать его с условием a1 = "a2" и хочу установить атрибуты a2 в своем пользовательском сообщении. Я могу сделать с потоком, фильтровать, отображать и собирать функции Java 8. Я уже упоминал код для того же самого.

list.stream().filter(a -> a.getA1().equalsIgnoreCase("a2")).map(a -> a.toBuilder().a2("New a2 value")).collect(Collectors.toList());

Когда я пытаюсь снова напечатать тот же список, но этот атрибут там не обновляется.

Опять же, когда я присваиваю это выражение списку и пытаюсь напечатать, это дает мне 1 отфильтрованную запись с обновленным значением. Но это не обновляет мой фактический список.

Может кто-нибудь, пожалуйста, подскажите мне?

@Builder(toBuilder = true)
    @Data
    class A {
        String a1;
        String a2;
        String a3;


        A(String b1, String b2, String b3) {
            this.a1 = b1;
            this.a2 = b2;
            this.a3 = b3;

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


            A obj1 = new A("a1", "b1", "b1");
            A obj2 = new A("a2", "b2", "b2");
            A obj3 = new A("a3", "b3", "b3");
            A obj4 = new A("a2", "b4", "b4");
            A obj5 = new A("a2", "b5", "b5");

           var list= new ArrayList<A>();
           list.add(obj1);
           list.add(obj2);
           list.add(obj3);    
           list.add(obj4);    
           list.add(obj5);    

list.stream().filter(a -> a.getA1().equalsIgnoreCase("a2"))
                    .map(a -> a.toBuilder()
                            .a2("New a2 value"))
                    .collect(Collectors.toList());
            }
        }

Я пробовал приведенный ниже код, и он работает нормально. Но он обновится на отдельных записях и сломает l oop.

list.stream().filter(a -> a.getA1().equalsIgnoreCase("a2"))
                    .map(a -> {
                        a.setA2("New a2 value");
                        return a;
                    });

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

toBuilder () создает новый экземпляр. Таким образом, вы получаете новый элемент в новом списке, когда попадаете в Collectors.toList ().

Если вы не используете .setA2 () для исходного элемента, вы не можете обновить список таким образом.

// You can reuse the list then.
list.stream().filter(a -> a.getA1().equalsIgnoreCase("a2"))
                    .forEach(a -> {
                        a.setA2("New a2 value");
                    });



// Alternatively, use a method reference
list.stream().filter(a -> a.getA1().equalsIgnoreCase("a2"))
                    .map(a -> {
                        this::update
                    });

private A update(A a) {
    a.setA2("new a2 value");
    return a;
}   

Также не стесняйтесь использовать потоки. Вы также можете использовать for () l oop с if () в нем.

0 голосов
/ 23 апреля 2020

Вам необходимо присвоить вновь созданный список переменной, которую можно использовать так же, как и раньше, но это будет новый список с введенными изменениями.

Чтобы назначить его этой же переменной просто добавьте list = перед выражением, подобным этому

list = list.stream().filter(a -> a.getA1().equalsIgnoreCase("a2"))
                    .map(a -> a.toBuilder()
                            .a2("New a2 value"))
                    .collect(Collectors.toList());

, которое я уже пробовал, и я могу получить этот фильтр один список записей там. Но мое требование - просто обновить значение соответствующей записи.

Я не уверен, если под value of matching record вы подразумеваете обновление списка или сохранение элементов списка и обновление значений в этих элементах , Чтобы обновить значение элемента, вы можете сделать

list.stream()
    .filter(a -> a.getA1().equalsIgnoreCase("a2"))
    .forEach(a -> a.setA2("New a2 value"));

Там вы не создаете новый список, просто обновляете значение элементов, которые проходят фильтр.

...