java - 使用 Java8 流 api 避免长代码行的最简洁方法

标签 java lambda java-8 java-stream

我应该如何重构这样的行?

return chars.codePoints().mapToObj(cp->((!Character.UnicodeBlock.SPECIALS.equals(Character.UnicodeBlock.of(cp))) && (! Character.isISOControl(cp)))?"'"+String.valueOf(Character.toChars(cp))+"'":"0x"+Integer.toHexString(cp)).collect(Collectors.joining(","));

我应该吗

  • 将流重新分配给局部变量,使其“更加垂直”,但将 lambda 保留在使用的位置
  • 创建一个类似 private String codePointToString(int cp) {...} 的方法将 lambda 缩短为 cp->codePointToString(cp)

  • 创建函数常量而不是方法: private static final IntFunction<String> codePointToString = cp->{...}; 并像mapToObj(codePointToString)一样使用它

最佳答案

我确实会提取一个方法codePointToString(),这将使代码更易于阅读和单元测试。我还希望每行一个步骤:

return chars.codePoints()
            .mapToObj(this::codePointToString)
            .collect(Collectors.joining(","));

为了使提取方法的代码可读,我还会在运算符周围放置空格,并使用 if 而不是三元运算符

private String codePointToString(int codePoint) {
   if (!Character.UnicodeBlock.SPECIALS.equals(Character.UnicodeBlock.of(cp)) 
       && !Character.isISOControl(cp)) {
       return "'" + String.valueOf(Character.toChars(cp)) + "'";
    }
    else {
        return "0x" + Integer.toHexString(cp);
    }
}

关于java - 使用 Java8 流 api 避免长代码行的最简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28022252/

相关文章:

java - 保留已完成工作项顺序的多线程执行

java - 如何在创建期间在 apache.jena.queryExecutionFactory 调试 NullPointerException?

java - 如何在java中查找本地/任何时区的时间戳过去的毫秒数

python - 从python DataFrame中的lambda函数的多个返回值创建多个列

java - 在 Java 中,如何高效优雅地流式传输树节点的后代?

java - MysqlDataSource调用 "Connection refused"异常

c# - 将两个 lambda 表达式与内部表达式结合起来

java - 提供 Stream 生成的限制条件

java - 计算对象图中多个数字的平均值

java - 将整数列表分组为分区