Лямбда-справка Java-действие с несколькими переменными-членами списка объектов

#java #lambda

Вопрос:

Если я хочу добавить все значения списка или даже массива, я мог бы использовать:

 List<MyObject> newList = ...
myObjects.stream().forEach(x -> newList.add(x));
 

Однако что, если вместо того, чтобы делать это со всем объектом, я хочу вместо этого действовать с переменными-членами объектов, где эти значения также являются списками?

Если бы я не использовал лямбды, я бы написал такой код, как:

 List<String> var1list = ...
List<String> var2list = ...
for (MyObject myObject : myObjects) {
  var1List.addAll(myObject.getVar1Values());
  var2List.addAll(myObject.getVar2Values());
}
 

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

Комментарии:

1. myObjects.stream().forEach(x -> {var1list.addAll(x.getVar1Values()); var2list.addAll(x.getVar2Values()); }); ?

2. @GreenCloakGuy вам не нужно использовать .stream() это решение.

3. Что не так с вашим текущим решением? Мне кажется, это довольно прямолинейно.

Ответ №1:

Я думаю, что вы пытаетесь перебрать мой объект и пытаетесь сделать над ним какую-то логику.

это должно быть похоже.

 List<String> var1list = new ArrayList<String>();
        List<String> var2list = new ArrayList<String>();
        List<MyObject> myObjects = Arrays.asList(new MyObject("1", "2"), new MyObject("3", "4"));
        
        myObjects.forEach((obj)->{
            var1list.add(obj.getVar1());
            var2list.add(obj.getVar2());
        });
 

Комментарии:

1. Я предлагаю вам сопоставить имена методов операций и т. Д.

Ответ №2:

ты это имеешь в виду?

 myObjects.stream()
   .map((it) -> it.getVar1Values())
   .forEach((it) ->{
     var1List.addAll(it);
     var2List.addAll(it);
})
 

Комментарии:

1. Для этого вам не нужно передавать список в потоковом режиме.

2. @WJS почему плохой способ использовать поток? Я слышал, и именно поэтому я спрашиваю об этом

3. Я никогда не говорил, что это плохо. Я сказал, что тебе не нужно им пользоваться. myObjects это список, и он поддерживает forEach напрямую. Так что вы можете сделать myObjects.forEach(it-> {var1List.addAll(it.getVar1Values()); var2List.addAll(it.getVar2Values());};