给出:
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中,在“功能化”注释之间编写代码的功能更强大的方法是什么?我当时正在考虑使用减少或收集的策略,但是脑子里看不到解决方案。
答案 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);