流<设定<路径>&GT;设置<path> </path> </set <path>

时间:2014-08-22 23:09:46

标签: java collections lambda java-8 java-stream

以下是使用流的Java 8代码:

Set<String> getFields( Path xml ) {
   final Set<String> fields = new HashSet<>();
   for( ... ) {
      ...
      fields.add( ... );
      ...
   }
   return fields;
}

void scan() {
   final SortedSet<Path> files = new TreeSet<>();
   final Path root = new File( "....." ).toPath();
   final BiPredicate<Path, BasicFileAttributes> pred =
      (p,a) -> p.toString().toLowerCase().endsWith( ".xml" );
   Files.find( root, 1, pred ).forEach( files::add );
   final SortedSet<String> fields = new TreeSet<>();
   files
      .stream()
      .parallel()
      .map( this::getFields )
      .forEach( s -> fields.addAll( s ));

      // Do something with fields...
}

我想将map( this::getFields )的输出,即Stream<Set<Path>>合并到Set<Path> ,我不确定正确使用forEach

在Jon Skeet回答总结评论并编译代码后编辑

Stream<String> getFields( Path xml ) {
   final Set<String> fields = new HashSet<>();
   for( ... ) {
      ...
      fields.add( ... );
      ...
   }
   return fields.stream(); // returns a stream to ease integration
}

void scan() {
   final Path root = new File( "....." ).toPath();
   final BiPredicate<Path, BasicFileAttributes> pred =
      (p,a) -> p.toString().toLowerCase().endsWith( ".xml" );
   final SortedSet<Path> files =
      Files
         .find( root, 1, pred )
         .collect( Collectors.toCollection( TreeSet::new ));
   final SortedSet<String> fields =
      files
         .stream()
         .parallel()
         .flatMap( this::getFields )
         .collect( Collectors.toCollection( TreeSet::new ));

      // Do something with fields...
}

两个流可以合并为一个,但files稍后会重复使用。

1 个答案:

答案 0 :(得分:6)

我怀疑你想要flatMap而不是map,然后使用Collectors.toCollection创建排序集:

final SortedSet<String> fields = files
    .stream()
    .parallel()
    .flatMap(x -> getFields(x).stream())
    .collect(Collectors.toCollection(() -> new TreeSet<String>());

(我没试过,所以语法可能稍微关闭,但我认为它大致是你想要的。)

一般情况下,我建议尝试使用在流操作中创建集合的方法,而不是在末尾使用forEach来添加所有内容 - 您可以对files执行相同操作。< / p>