管道中的中间步骤

时间:2016-05-12 16:58:03

标签: java lambda java-8 java-stream

如果这是一个基本问题,那么请原谅我的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是一个对象数组的列表,其id为Object[0],有效期为Object[1]。上述代码基本上执行以下操作 -

  1. 使用密钥terms和值resultMap对象
  2. id列表转换为TermResult
  3. TermResult添加到results
  4. 我能够将#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
    3. 感谢您的投入!

1 个答案:

答案 0 :(得分:3)

不,它不能并行完成;当然D = np.vstack((A,B[np.newaxis,:,:])) print(D.shape) 不是线程安全的,即使在保留秩序时也不是。 (此外 - 在您实际测量操作所需的时间之前添加并行性几乎总是一个坏主意。如果您只是将它打到各处,并行性更有可能损害性能而不是帮助。 )

所有这一切都说,溪流实际上并不打算一次做多件事。您只是创建地图,然后遍历其(8, 6, 2) ,或者根据{{1实际上是。您可以按照您描述的方式进行操作,但不应该。