在Java 8中,用索引更新列表中的项目的更实用的方法是什么?

时间:2018-07-11 15:55:09

标签: java-8 functional-programming

给出:

  static class Item {
    String name;
    int index;

    Item(String name) {
      this.name = name;
    }
  }

  @Test
  public void test() {
    List<Item> items =
        Arrays.stream(new String[] {"z", "y", "x"})
          .map(Item::new)
          .collect(Collectors.toList());
    items.sort(Comparator.comparing(o -> o.name));

    // begin functionalize me    
    int i = 0;
    for (Item it : items) {
      it.index = i++;
    }
    // end functionalize me

    assertEquals(0, items.get(0).index);
    assertEquals(1, items.get(1).index);
    assertEquals(2, items.get(2).index);
  }

在Java 8中,在“功能化”注释之间编写代码的功能更强大的方法是什么?我当时正在考虑使用减少或收集的策略,但是脑子里看不到解决方案。

1 个答案:

答案 0 :(得分:3)

您不应认为Collectors.toList()返回的列表是可变的。因此,您不能在其上调用sort。在您的特定情况下,您可以在收集之前进行排序:

List<Item> items = Stream.of("z", "y", "x")
  .map(Item::new)
  .sorted(Comparator.comparing(o -> o.name))
  .collect(Collectors.toList());

或者,因为name与传入的字符串相同:

List<Item> items = Stream.of("z", "y", "x")
  .sorted()
  .map(Item::new)
  .collect(Collectors.toList());

然后,您可以使用来更新列表项

IntStream.range(0, items.size()).forEach(i -> items.get(i).index = i);