使用java.util.stream将列选择到记录列表中

时间:2014-05-27 13:32:25

标签: java java-8 java-stream

来自List<record>

public final class Record {
   ... // Several fields
   private final SimpleSetProperty<String>  _outOfDate;

   Record( ..., SortedSet< String > outOfDate, ... ) {
      ...
      _outOfDate =
         new SimpleSetProperty<>( FXCollections.observableSet( outOfDate ));
      ...
   }

   public SimpleSetProperty<String> outOfDateProperty() {
      return _outOfDate;
   }
   ... // Other accessors
}

我尝试仅提取OutOfDate列(一组字符串),并使用以下代码将所有值合并到一个字符串集中。

List< Record > statuses = worker.getData()._status;
final Set<String> result =
   statuses
      .stream()
      .flatMap(
         r -> r.outOfDateProperty().get().stream())
      .collect( Collectors.toSet());
System.err.println( result );

输出:

  

class java.util.HashSet:[HF_SYNTHETIZER_1,POWER_METER,   SERIAL_SERVER,BENCH_ETH_SW,CW_SENSOR,LF_GENERATOR,   SPECTRUM_ANALYZER,PC_SUPERVISION]

它有效,但它有点复杂,不是吗?

我的问题是:提出更简洁/可读的代码

1 个答案:

答案 0 :(得分:2)

您可以省略大多数与Stream相关的操作,只需使用Collection的addAll方法直接将所有元素添加到Set中:

Set<String> result = new HashSet<>(); // or another kind of Set
statuses.forEach(r -> result.addAll(r.outOfDateProperty().get()));

它没有充分利用Stream API,但它更短更容易阅读。