运行两个流,并从中创建一个对象

时间:2019-05-15 12:01:37

标签: java java-8 java-stream

我有两个列表

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 个答案:

答案 0 :(得分:4)

鉴于a和b列表的大小相同,这应该可以解决问题,

List<Obj> objList = IntStream.range(0, a.size())
    .mapToObj(i -> new Obj(a.get(i), b.get(i)))
    .collect(Collectors.toList());

答案 1 :(得分:0)

有几种方法可以实现列表和流的Zip操作(例如,参见this post),但是您可以在Guava Streams中使用现有的方法com.google.common.collect.Streams.zip。这样,您的代码应如下所示:

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