我想使用Optional来处理空值,我想不出最好的方法是什么的“棘手”部分 - 是我想在值为空时进行记录。我可以用下面的代码来实现这一点 - 但感觉很尴尬。
(更新:我已经发布了我自己的答案,其中包含 Java 9 中的可选)
可以说代码如下所示:
// logLine.getSomeProperty returns Optional<String>
List<LogDetails> logDetails = logLine.getSomeProperty()
.map(this::extractLogDetails)
.orElseGet(() -> logError(logLine));
Run Code Online (Sandbox Code Playgroud)
List<LogDetails> extractLogDetails(String s) {
List<LogDetails> logDetails = new ArrayList<>();
String sp = "(?:([A-Z0-9]{5,7})-([A-Z0-9]{9})-(.{4}))";
Pattern p = Pattern.compile(sp, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(s);
while (m.find()) {
logDetails.add(new LogDetails(m.group(1), m.group(2), m.group(3)));
}
return logDetails;
}
Run Code Online (Sandbox Code Playgroud)
List<LogDetails> logError(LogLine logLine) {
log.error("Error while ... {} ", logLine));
persistence.setErrorStatus(logLine, FAILED_PARSING);
return new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)
它会做我想做的事,但我有几个“问题”。
orElseGet用于记录错误。我正在尝试编写“通用”函数来执行 SQL 查询并返回 JSON 并处理其中的错误。在处理过程中,有一些我不明白的事情 - 为什么 try catch 块不处理错误。(稍后我将改进逻辑 - 问题与此无关,而纯粹与错误处理有关)。
这是我的代码:
public
function sqlToJSON($query, $type = array(), $params = array())
{
try {
$data = array();
$stmt = $this->mysqli->prepare($query);
if (count($type) > 0 && count($params) > 0) {
call_user_func_array(array($stmt, "bind_param"), array_merge(array($type), $params));
}
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
$stmt->free_result();
$stmt->close();
return array('result' => 'success', 'error' => null, 'data' => $data);
} catch (Exception $e) {
$this->sqlError = 'Caught exception: ' …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用泛型(我第一次尝试使用泛型)并使用ExecutorService来实现“ TaskExecutor”。
这是我的“ TaskExecutor”类:
public class ExecuteAlerterTask<T> {
public List<T> process(String executorName, Callable<T> task) throws ExecutionException, InterruptedException {
final ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNameFormat(executorName + "-%d")
.setDaemon(true)
.build();
ExecutorService executor = Executors.newFixedThreadPool(10, threadFactory);
Collection<Future<T>> futures = new ArrayList<>();
IntStream.range(1, 10).forEach(i -> {
Future<T> future = executor.submit(task);
futures.add(future);
});
List<T> result = new ArrayList<>();
for (Future<T> f : futures) {
result.add(f.get());
}
executor.shutdown();
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的运行方式:
@Test
public void process() throws Exception {
Callable<String> callable = () -> …Run Code Online (Sandbox Code Playgroud) 我google了很多,但没有找到答案.这是我有的:
parentList.forEach(p -> {
childList
.stream()
.filter(c -> p.id() == c.parentId())
.<...continue working on stream...>
});
Run Code Online (Sandbox Code Playgroud)
我找不到如何用谓词替换"过滤器"部分的方法,因为我似乎需要将参数传递给Predicate?
我有多模块 Maven 项目。每个模块都有自己的 git repo。根据 gitlab文档,每个模块都必须有 .m2/settings.xml 文件用于 CI/CD 通过 .gitlab-ci.yml 才能工作。
我想避免在每个模块中都有相同的 .m2/settings.xml 文件。有没有办法实现这一目标?