小编lap*_*nis的帖子

使用Optional.orElseGet 来做一些日志记录逻辑是个好主意吗

我想使用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用于记录错误。
  • 我可以用 orElseThrow 和 logError 替换 …

java

6
推荐指数
1
解决办法
5353
查看次数

try catch 块中未捕获的错误

我正在尝试编写“通用”函数来执行 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)

php mysql

5
推荐指数
1
解决办法
1871
查看次数

带参数的可调用lambda表达式

我正在尝试使用泛型(我第一次尝试使用泛型)并使用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)

java lambda callable

5
推荐指数
1
解决办法
6874
查看次数

按两个参数流过滤

我google了很多,但没有找到答案.这是我有的:

    parentList.forEach(p -> {
        childList
                .stream()
                .filter(c -> p.id() == c.parentId())
                .<...continue working on stream...>
    });
Run Code Online (Sandbox Code Playgroud)

我找不到如何用谓词替换"过滤器"部分的方法,因为我似乎需要将参数传递给Predicate?

java predicate java-stream

3
推荐指数
1
解决办法
2900
查看次数

gitlab 中的 maven settings.xml 重复

我有多模块 Maven 项目。每个模块都有自己的 git repo。根据 gitlab文档,每个模块都必须有 .m2/settings.xml 文件用于 CI/CD 通过 .gitlab-ci.yml 才能工作。

我想避免在每个模块中都有相同的 .m2/settings.xml 文件。有没有办法实现这一目标?

continuous-integration maven gitlab

3
推荐指数
2
解决办法
3200
查看次数