Запустите два потока и сделайте объект из этих - PullRequest
2 голосов
/ 15 мая 2019

У меня есть два списка

List<String> a = Arrays.asList( "1" , "2" , "3" );
List<String> b = Arrays.asList( "a" , "b" , "c" );

и класс

class Obj{
   String a;
   String b;
   public Obj(String a, String b){
       this.a=a;
       this.b=b;
   }
}

Мне нужно преобразовать каждый список 2 элементов в объект вышеупомянутого класса.В результате получается список объектов Obj примерно в таком виде -

[ Obj("1","a") , Obj("2","a") , Obj("3","a") ]

Я знаю, что могу сделать это просто запустив цикл.

List<Obj> arrayList = new ArrayList<>();

for( int i=0; i<allAttributes.size(); i++){
    arrayList.add( new Obj(a[i],b[i]) );
}

Хотел узнать, можно ли это сделатьсделано в Java 8 элегантным способом.

Ответы [ 2 ]

4 голосов
/ 15 мая 2019

Учитывая, что списки a и b имеют одинаковый размер, это должно сработать,

List<Obj> objList = IntStream.range(0, a.size())
    .mapToObj(i -> new Obj(a.get(i), b.get(i)))
    .collect(Collectors.toList());
0 голосов
/ 15 мая 2019

Существует несколько способов реализации Zip-операции для списков и потоков (см., Например, этот пост ), но вы можете использовать существующий метод com.google.common.collect.Streams.zip в потоках Guava.Таким образом, ваш код может выглядеть следующим образом:

final List<String> a = Arrays.asList("1", "2", "3");
final List<String> b = Arrays.asList("a", "b", "c");
List<Obj> objs = Streams.zip(a.stream(), b.stream(), (pa, pb) -> new Obj(pa, pb))
            .collect(Collectors.toList());

После этого вы можете дополнительно отфильтровать поток, например:

List<Obj> objs = Streams.zip(a.stream(), b.stream(), (pa, pb) -> new Obj(pa, pb))
            .filter(obj -> StringUtils.isNotEmpty(obj.b))
            .collect(Collectors.toList());
...