2016-05-12 113 views
1

如果这是一个基本问题,非常新的流API的如此赦免。我想转换此代码段使用Java 8个流流水线中的中间步骤

Resultset results = new Resultset(); 
    List<Object[]> terms = service.search(term); 
    Map<Long, TermResult> resultMap = new HashMap<Long, TermResult>(); 
    for(Object[] term : terms) { 
     Long id = (Long)term[0]; 
     String termStr = (String)term[1]; 
     TermResult termResult = new TermResult(id, termStr); 
     resultMap.put(id, termResult); 
     results.addResult(termResult); 
    } 

terms是在Object[0] ID和长期目标阵列以及Object[1]。以上代码清单主要执行以下操作 -

  1. 转换terms列表resultMap与关键id和值TermResult对象
  2. 添加TermResult成一组
  3. results

我是能够转换#1使用流 -

Map<Long, TermResult> resultMap = 
        terms.stream().collect(Collectors.toMap(p -> (Long)p[0], p -> new TermResult((Long)p[0], (String)p[1]))); 

但我怎么会偷偷在#2在上述管道?

这是我想出了利用peek -

Map<Long, TermResult> resultMap = 
       terms.stream().map(p -> new TermResult((Long)p[0], (String)p[1])) 
         .peek(p -> results.addResult(p)) 
         .collect(Collectors.toMap(p -> p.getId(), p -> p)); 
  1. 这是这样做的正确方法?
  2. 也可以这样做并行吗?我希望resultsterms列表的顺序相同(按术语排序)。我在上面的代码片段中尝试使用parallelStream。但订单不保存在results

谢谢您的输入!

+2

另请参见[“在Java流是真的只用于调试吗?”](http://stackoverflow.com/q/33635717/2711488) – Holger

回答

3

不,它不能并行完成;当然,如果results不是线程安全的,甚至在保持顺序时不是这样。 (和另外 - 之前你实际测量的操作需要多长时间增加并行是几乎总是一个坏主意并行更可能损害性能不是帮助,如果你只是拍它无处不在。)

这一切说,溪流真的不打算一次做超过一件事。你几乎肯定会更好,只是创建地图,然后遍历其values(),或者只是创建一个Set取决于results实际是什么。你可以这样做你描述的方式,但你不应该。