小编abi*_*abi的帖子

Java 并行流 - 调用 parallel() 方法的顺序

AtomicInteger recordNumber = new AtomicInteger();
Files.lines(inputFile.toPath(), StandardCharsets.UTF_8)
     .map(record -> new Record(recordNumber.incrementAndGet(), record)) 
     .parallel()           
     .filter(record -> doSomeOperation())
     .findFirst()
Run Code Online (Sandbox Code Playgroud)

当我写这篇文章时,我假设线程将只产生 map 调用,因为 parallel 放在 map 之后。但是文件中的某些行在每次执行时都获得了不同的记录号。

我阅读了官方Java 流文档和一些网站,以了解流在幕后是如何工作的。

几个问题:

  • Java 并行流基于SplitIterator 工作,它由每个集合(如 ArrayList、LinkedList 等)实现。当我们从这些集合中构造并行流时,将使用相应的拆分迭代器来拆分和迭代集合。这解释了为什么并行发生在原始输入源(文件行)级别而不是映射的结果(即记录 pojo)。我的理解正确吗?

  • 就我而言,输入是文件 IO 流。将使用哪个拆分迭代器?

  • 我们parallel()在管道中的位置并不重要。原始输入源将始终被拆分,并将应用剩余的中间操作。

    在这种情况下,Java 不应该允许用户在管道中的任何地方放置并行操作,除了原始源。因为,对于那些不知道 java 流内部如何工作的人来说,这是错误的理解。我知道parallel()已经为 Stream 对象类型定义了操作,因此它以这种方式工作。但是,最好提供一些替代解决方案。

  • 在上面的代码片段中,我试图为输入文件中的每条记录添加一个行号,因此应该对其进行排序。但是,我想doSomeOperation()并行应用,因为它是重量级逻辑。实现的一种方法是编写我自己的自定义拆分迭代器。有没有其他办法?

java java-stream

12
推荐指数
2
解决办法
567
查看次数

给定n,找到为n得到的最大数字

问题在oracle访谈中提出.例如,如果我的输入是6,那么

  • 5 + 1 = 6 Ans:2
  • 4 + 2 = 6答案:2
  • 3 + 2 + 1 = 6答案:3

所以,最终的答案应该是3.(即获得总和6需要3,2,1)

注意:不允许重复数字(即1 + 1 + 1 + 1 + 1 + 1 = 6)

我用递归解决了它但面试官并不满意.动态编程是否可行?

c algorithm

5
推荐指数
2
解决办法
239
查看次数

自定义龙目岛超级构建器

我有一个父抽象类“Parent”和子类“Child”。我正在使用 @SuperBuilder 生成构建器 API。现在,作为构建的一部分,我想对“Parent”和“Child”类的成员执行一些验证。我找不到任何解决方案来自定义龙目岛超级构建器。根据lombok文档,这似乎是可能的。有人可以解释一下吗?

@SuperBuilder
public abstract class Parent {
    int x;
    int y;
    int z;
    int a;
}

@SuperBuilder
public abstract class Child extends Parent {
    int b;
    int c;
    int d;

    // I want something like
    public static class ChildBuilder {

       public Child build() {
           Child child = // Get child somehow;
           validate(child);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

java builder lombok

4
推荐指数
1
解决办法
2260
查看次数

列式数据库中的多列选择

我只是了解基于行和基于列的数据库之间的区别。我知道它们的好处,但我有几个问题。假设我有一个包含 3 列的表 - col1、col2 和 col3。我想获取所有 col2、col3 对,其中 col3 与特定值匹配。假设列值存储在磁盘中,如下所示。

块 1 = col1
块 2,块 3 = col2
块 4 = col3

  1. 我的理解是列值和行 ID 信息将存储在一个块中。例如:(Block4 -> 苹果:row_2,香蕉:row_1)。我对么?
  2. 块中的值是否按列值排序?例如:(Block4 -> apple:row_2, Banana:row_1 而不是 Block4 -> Banana:row_1, apple:row_2)。如果不是,过滤或搜索如何在不影响性能的情况下工作?
  3. 假设块中的值根据列值排序,那么如何根据从 Block4 获取的行 id 过滤相应的 col2 值?那么需要线性搜索吗?

sql database indexing

0
推荐指数
1
解决办法
1028
查看次数

标签 统计

java ×2

algorithm ×1

builder ×1

c ×1

database ×1

indexing ×1

java-stream ×1

lombok ×1

sql ×1