流收集后继续映射

时间:2018-09-18 08:25:58

标签: java java-8 java-stream

收集后如何继续流映射:

// 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(列表人员)。

5 个答案:

答案 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()....

或仅删除collectlist.stream().map(name -> new Person(name)).map(...)。在您的情况下,这更有意义

答案 3 :(得分:0)

假设BusList个对象中的一个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 为空时抛出。