【问题标题】:Java 8 - how to copy a property value from one list to another?Java 8 - 如何将属性值从一个列表复制到另一个列表?
【发布时间】:2015-11-26 12:09:46
【问题描述】:

我有两个Lists,例如:

List<Foo> list1 = Lists.newArrayList(new Foo(...),...);
List<Bar> list2 = Lists.newArrayList(new Bar(...),...);

Bar 中有一个属性fooId。假设list1.size() == list2.size()。 我想按顺序设置Bar 实例的fooIds。

我试过下面的代码:

int index = 0;
list2.forEach(b -> b.fooId = list1.get(index++).getId());

但编译失败

在封闭范围内定义的局部变量索引必须是最终的或有效的最终

Java 8 是否有一些方便的方式来处理这个问题?

【问题讨论】:

    标签: java lambda java-8


    【解决方案1】:

    您不能从 lambda 表达式中修改 index 变量。

    您可以使用 IntStream 迭代索引(尽管与简单的 for 循环相比,这并没有太大的改进):

    IntStream.range(0,list1.size())
             .forEach(i -> list2.get(i).setFooId(list1.get(i).getId()));
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      IntStream.range(0, list1.size())
               .forEach(i -> list2.get(i).fooId = list1.get(i).getId());
      

      但请注意,这不是好的功能代码。你最好写一个明确的for循环而不使用Stream。

      您问题中的代码不起作用,因为您无法在非最终(或实际上是最终)的 lambda 表达式中引用变量。

      如果您在此操作后不介意list1 并且可以删除其元素,您也可以使用此:

      list2.forEach(bar -> bar.fooId = list1.remove(0).getId());
      

      【讨论】:

        【解决方案3】:

        不幸的是,Java 8 流 API 中没有 zip 操作。但是你可以使用protonpack 库。

        List<Bar> upd = StreamUtils.zip(list1.stream(), list2.stream(), (foo, bar) -> {
          bar.setId(foo.getId());
          return bar;
        }).collect(Collectors.toList());
        

        我还想补充一点,使用可变数据对象是一种命令式风格。在函数式风格中,如果您需要更改任何内容,最好使用不可变数据并返回新对象。

        【讨论】:

          【解决方案4】:

          使用我的 StreamEx 库,您可以减少样板:

          EntryStream.zip(list1, list2).forKeyValue((foo, bar) -> bar.fooId = foo.getId());
          

          EntryStream.zip 为每对对应的list1list2 创建一个Map.Entry&lt;Foo, Bar&gt; 流。 forKeyValue 方法接受BiConsumer(它是forEach 的语法糖)。在内部它接近@Eran 解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-05
            • 2012-07-21
            • 1970-01-01
            • 2012-08-12
            • 2010-10-05
            • 1970-01-01
            • 2022-11-12
            • 2012-02-18
            相关资源
            最近更新 更多