【问题标题】:Retrieve copy of an object from a java stream从 java 流中检索对象的副本
【发布时间】:2015-04-23 01:54:10
【问题描述】:

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

目前,我是这样做的。

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

我的问题是,没有更优雅的方式来处理流?

【问题讨论】:

    标签: java optional java-stream


    【解决方案1】:

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

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

    【讨论】:

    • 这将是我的答案,但正如问题所述,这与Foo foo = new Foo(anotherFooId)); 相同。我假设其他一些字段也必须被复制。
    • @pbabcdefp 是的,我还假设Foo 只是一个示例,并且复制构造函数所做的不仅仅是设置thid.id
    • 是的,复制了很多字段。一个更好的例子可以是 Person 对象。
    【解决方案2】:
    Foo foo = new Foo(fooList.stream()
                .filter(f -> (f.getId().equals(anotherFooId)))
                .findAny().get());
    

    【讨论】:

    • 如果没有正确 id 的 Foo 会抛出异常。
    • 你可以用try-catch包围上面的代码来捕捉NoSuchElementException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多