收集后如何继续流映射:
// if you do not change the list object, there is no need to raise PropertyChanged in setter
public BindingList<Data> Data { get; set; } = new BindingList<Data>();
// constructor
public ViewModel(){
// Update property Summary if our list changes.
List.ListChanged += (sender, arg) => OnPropertyChanged(nameof(Summary));
}
以上显然不起作用。如何使其优雅地工作而不在方法主体中使用任何变量?
编辑: 构造函数是Bus(列表人员)。
答案 0 :(得分:3)
您可以使用Collectors.collectingAndThen中的收集器执行附加的整理转换:
public Bus createBus(List<String> passengers) {
return passengers.stream()
.map(name -> new Person(name))
.collect(Collectors
.collectingAndThen(Collectors.toList(),people -> new Bus(people)));
}
答案 1 :(得分:2)
map
将遍历列表中的每个Person
。相反,您的Bus
似乎需要整个列表作为参数。实际上,您尝试为Bus
列表中的每个名称创建一个新的passengers
。
您可以将收集到的列表直接传递给构造函数:
public Bus createBus(List<String> passengers) {
return new Bus(passengers.stream()
.map(name -> new Person(name))
.collect(Collectors.toList()));
}
或将其存储在变量中(我认为更清楚):
public Bus createBus(List<String> passengers) {
List<Person> persons = passengers.stream()
.map(name -> new Person(name))
.collect(Collectors.toList());
return new Bus(persons);
}
答案 2 :(得分:1)
由于collect
返回集合,因此您需要在新的收集列表上打开新的流:
list.stream().map(name -> new Person(name))
.collect(Collectors.toList())
.stream()....
或仅删除collect
:list.stream().map(name -> new Person(name)).map(...)
。在您的情况下,这更有意义
答案 3 :(得分:0)
假设Bus
有List
个对象中的一个Person
:
public Bus createBus(List<String> passengers) {
return new Bus(passengers.stream().map(name -> new Person(name)).collect(Collectors.toList()));
}
另一种选择:
public Bus createBus(List<String> passengers) {
return new Bus(getPersons(passengers));
}
private List<Person> getPersons(List<String> passengers) {
return passengers.stream().map(name -> new Person(name)).collect(Collectors.toList());
}
答案 4 :(得分:0)
如果您不想引入任何额外的变量,我相信可以通过这种方式实现:
ImageUploader
收集创建一个集合,然后再次转换为流。在这种情况下 1 个元素的流。然而它仍然是一个流,所以如果你只想返回一个 public Bus createBus(List<String> passengers) {
return passengers.stream()
.map(Person::new)
.collect(Collectors.collectingAndThen(Collectors.toList(), Stream::of))
.map(Bus::new)
.reduce((first, second) -> second)
.orElseThrow();
}
(不是 Bus
的列表),它必须以某种方式减少。在这里,我只是将其缩减为 1,因为无论如何流都会有一个元素。
Bus
操作返回 reduce
,所以你必须检查它是否在那里,当你得到它时。为简单起见,这段代码只会在 Optional 为空时抛出。