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()
并行应用,因为它是重量级逻辑。实现的一种方法是编写我自己的自定义拆分迭代器。有没有其他办法?
问题在oracle访谈中提出.例如,如果我的输入是6,那么
所以,最终的答案应该是3.(即获得总和6需要3,2,1)
注意:不允许重复数字(即1 + 1 + 1 + 1 + 1 + 1 = 6)
我用递归解决了它但面试官并不满意.动态编程是否可行?
我有一个父抽象类“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) 我只是了解基于行和基于列的数据库之间的区别。我知道它们的好处,但我有几个问题。假设我有一个包含 3 列的表 - col1、col2 和 col3。我想获取所有 col2、col3 对,其中 col3 与特定值匹配。假设列值存储在磁盘中,如下所示。
块 1 = col1
块 2,块 3 = col2
块 4 = col3