Java工具箱-Code Style转换工具类

Code Style之间相互转化工具

支持的Code Style

  • 小驼峰(camelCase):首字母小写,分隔部分大写,其余全小写
  • 大驼峰(PascalCase):首字母大写,分隔部分大写,其余全小写
  • 小下划线(snake_case): 全小写,分隔部分用 _ 标记
  • 大下划线(SCREAMING_SNAKE_CASE:) 全大写,分隔部分用 _ 标记
  • 中下划线(kebab-case): 全小写,分隔部分用 - 标记

代码

/**
 * 大小写风格的枚举类型.
 * 支持在任意两种code style之间相互转换
 * @author binggo
 */
public enum CaseMode {

   /**
    * snake_case
    */
   SNAKE {
      @Override
      protected boolean isSplitMarker(Character lastChar, Character currentChar) {
         return lastChar != null && lastChar.equals('_') && Character.isLetter(currentChar);
      }

      @Override
      protected boolean needRemove(Character lastChar, Character currentChar) {
         return currentChar.equals('_');
      }

      @Override
      public String toSnakeCase(String original) {
         return original;
      }
   },
   /**
    * camelCase
    */
   CAMEL {
      @Override
      protected boolean isSplitMarker(Character lastChar, Character currentChar) {
         return lastChar != null && Character.isLowerCase(lastChar) && Character.isUpperCase(currentChar);
      }

      @Override
      protected boolean needRemove(Character lastChar, Character currentChar) {
         return false;
      }

      @Override
      public String toCamelCase(String original) {
         return original;
      }
   },
   /**
    * kebab-case
    */
   KEBAB {
      @Override
      protected boolean isSplitMarker(Character lastChar, Character currentChar) {
         return lastChar != null && lastChar.equals('-') && Character.isLetter(currentChar);
      }

      @Override
      protected boolean needRemove(Character lastChar, Character currentChar) {
         return currentChar.equals('-');
      }

      @Override
      public String toKebabCase(String original) {
         return original;
      }
   },
   /**
    * PascalCase
    */
   PASCAL {
      @Override
      protected boolean isSplitMarker(Character lastChar, Character currentChar) {
         return lastChar != null && Character.isLowerCase(lastChar) && Character.isUpperCase(currentChar);
      }

      @Override
      protected boolean needRemove(Character lastChar, Character currentChar) {
         return false;
      }

      @Override
      public String toPascalCase(String original) {
         return original;
      }
   },
   /**
    * SNAKE_CASE
    */
   SCREAMING_SNAKE {
      @Override
      protected boolean isSplitMarker(Character lastChar, Character currentChar) {
         return lastChar != null && lastChar.equals('_') && Character.isLetter(currentChar);
      }

      @Override
      protected boolean needRemove(Character lastChar, Character currentChar) {
         return currentChar.equals('_');
      }

      @Override
      public String toScreamingSnakeCase(String original) {
         return original;
      }
   };

   protected String styleCase(String original, TransferFunction transferFunction) {
      StringBuilder ret = new StringBuilder(original.length());
      char[] chars = original.toCharArray();
      Character lastChar = null;
      for (char currentChar : chars) {
         boolean needRemove = needRemove(lastChar, currentChar);
         if (!needRemove) {
            boolean splitMarker = isSplitMarker(lastChar, currentChar);
            ret.append(transferFunction.transfer(splitMarker, lastChar, currentChar));
         }
         lastChar = currentChar;
      }
      return ret.toString();
   }

   public String toSnakeCase(String original) {
      return styleCase(original, this::transfer2SnakeCase);
   }

   public String toCamelCase(String original) {
      return styleCase(original, this::transfer2CamelCase);
   }

   public String toKebabCase(String original) {
      return styleCase(original, this::transfer2KebabCase);
   }

   public String toPascalCase(String original) {
      return styleCase(original, this::transfer2PascalCase);
   }

   public String toScreamingSnakeCase(String original) {
      return styleCase(original, this::transferScreamingSnakeCase);
   }
   /**
    * snake_case:
    * 全小写,分隔部分用 _ 标记
    * */
   protected String transfer2SnakeCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
      String ret = "";
      if (isSplitMarker) {
         ret += ("_" + currentChar);
      } else {
         ret += Character.toLowerCase(currentChar);
      }
      return ret;
   }
   /**
    * camelCase:
    * 首字母小写,分隔部分大写,其余全小写
    * */
   protected String transfer2CamelCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
      String ret = "";
      if (lastChar == null) {
         ret += Character.toLowerCase(currentChar);
      } else if (isSplitMarker) {
         ret += Character.toUpperCase(currentChar);
      } else {
         ret += Character.toLowerCase(currentChar);
      }
      return ret;
   }
   /**
    * kebab-case:
    * 全小写,分隔部分用 - 标记
    * */
   protected String transfer2KebabCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
      String ret = "";
      if (isSplitMarker) {
         ret += ("-" + currentChar);
      } else {
         ret += Character.toLowerCase(currentChar);
      }
      return ret;
   }
   /**
    * PascalCase:
    * 首字母大写,分隔部分大写,其余全小写
    * */
   protected String transfer2PascalCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
      String ret = "";
      if (lastChar == null) {
         ret += Character.toUpperCase(currentChar);
      } else if (isSplitMarker) {
         ret += Character.toUpperCase(currentChar);
      } else {
         ret += Character.toLowerCase(currentChar);
      }
      return ret;
   }
   /**
    * SCREAMING_SNAKE_CASE:
    * 全大写,分隔部分用 _ 标记
    * */
   protected String transferScreamingSnakeCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
      String ret = "";
      if (isSplitMarker) {
         ret += ("_" + currentChar);
      } else {
         ret += Character.toUpperCase(currentChar);
      }
      return ret;
   }
   /**
    * lastChar和currentChar之间是否分隔的地方
    * */
   protected abstract boolean isSplitMarker(Character lastChar, Character currentChar);
   /**
    * currentChar是否需要在转换结果中被移除
    * */
   protected abstract boolean needRemove(Character lastChar, Character currentChar);


   private interface TransferFunction {
      String transfer(boolean isSplitMarker, Character lastChar, Character currentChar);
   }
   /**
    * 工具类帮助在任意两种类型之间转换
    * */
   public static String convert(String fromString, CaseMode fromMode, CaseMode toMode) {
      String ret = "";
      switch (toMode) {
         case CAMEL:
            ret = fromMode.toCamelCase(fromString);
            break;
         case KEBAB:
            ret = fromMode.toKebabCase(fromString);
            break;
         case PASCAL:
            ret = fromMode.toPascalCase(fromString);
            break;
         case SNAKE:
            ret = fromMode.toSnakeCase(fromString);
            break;
         case SCREAMING_SNAKE:
            ret = fromMode.toScreamingSnakeCase(fromString);
            break;
      }
      return ret;
   }
}
复制代码

使用方式

//方式一:类似TimeUnit的使用方式,将一种Code Style转化成另外一种
@Test
void snake2CamelTest() {    
       Assertions.assertThat(CaseMode.SNAKE.toCamelCase("qweee_qweqwe")).isEqualTo("qweeeQweqwe");
}

//方式二:任意两种Code Style之间相互转换
CaseMode.convert(originCaseStr, fromMode, toMode);

复制代码

猜你喜欢

转载自juejin.im/post/7016655079247708191