从java流中检索对象的副本

时间:2015-04-23 01:54:10

标签: java optional java-stream

我想从过滤后的流中获取对象的副本。

此刻,我这样做了。

Foo foo = new Foo(fooList.stream()
                .filter(f -> (f.getId().equals(anotherFooId)))
                .findAny().orElse(new Foo(anotherFooId)));

可以看出,除了其他构造函数之外,这个对象还有一个克隆构造函数。

class Foo {    
   private String id;
   Foo(String id) {
      this.id = id;
   }
   Foo(Foo originalFoo) {
      this.id = originalFoo.getId();
   }
}

我的问题是,用流来做这个没有更优雅的方法吗?

2 个答案:

答案 0 :(得分:3)

您可以在Foo::new之后致电findAny(),这样当您找不到匹配项时,您就不需要实例化两个对象:

Foo foo = fooList.stream()
                 .filter(f -> (f.getId().equals(anotherFooId)))
                 .findAny().map(Foo::new).orElse(new Foo(anotherFooId));

答案 1 :(得分:0)

Foo foo = new Foo(fooList.stream()
            .filter(f -> (f.getId().equals(anotherFooId)))
            .findAny().get());