Java - 检查 under_score 字符串是否在 lowerCamel 字符串列表中

如何解决Java - 检查 under_score 字符串是否在 lowerCamel 字符串列表中

考虑以下键(under_score)和字段(lowerCamel):

keys   = ["opened_by","ticket_owner","close_reason"]
fields = ["openedBy","ticketowner","closeReason"]

我正在寻找一种有效的 Java 方法来检查 key 是否在 fields 中,我希望以下内容返回 true

fields = ["openedBy","ticketowner"]

return fields.contains("opened_by"))   //true

我的代码

Set<String> incidentFields = Arrays
            .stream(TicketIncidentDTO.class.getDeclaredFields())
            .map(Field::getName)
            .collect(Collectors.toSet()
            );


responseJson.keySet().forEach(key ->{
           
            if (incidentFields.contains(key)) 
            {
                //Do something
            }
        });

我可以用下划线替换所有小写字母,但我正在寻找更有效的方法

解决方法

尝试使用 CaseUtils 中的 Commons Text

// opened_by -> openedBy
private String toCamel(String str) {
    return CaseUtils.toCamelCase(str,false,new char[] { '_' });
}

List<String> keys = Arrays.asList("opened_by","ticket_owner","close_reason","full_name");

List<String> fields = Arrays.asList("openedBy","ticketOwner","closeReason");

keys.forEach(t -> {
    // check
    if (fields.contains(toCamel(t))) {
        System.out.println(t);
    }
});
,

如果您没有 abcXyz (abc_xyz) 和 abCxyz (ab_cxyz) 等字段(具有相同拼写但不同单词组合的字段),那么一种解决方案将用空的 "_" 替换 "",然后使用 equalsIgnoreCase 与 fieldName 进行比较。另一个但类似的解决方案是将每个 fieldName 转换为小写,然后在将“_”替换为“”后将其与驼峰式字符串进行比较。与第一种方法相比,这可能会消除额外循环的使用。


Set<String> fields= Arrays.stream(TicketIncidentDTO.class.getDeclaredFields())
                          .map(Field::getName)
                          .map(String::toLowerCase)
                          .collect(Collectors.toSet());


responseJson.keySet()
            .filter(key -> fields.contains(key.replaceAll("_","")))
            .forEach(key -> {
                // do something..
            });
,

一个简单的 toCamel 方法:

private String toCamel(String str) {
    String[] parts = str.split("_");
    StringBuilder sb = new StringBuilder(parts[0]);
    for (int i=1; i < parts.length ; i++) {
        String part = parts[i];
        if (part.length() > 0) {
            sb.append(part.substring(0,1).toUpperCase()).append(part.substring(1));
        }
    }
    return sb.toString();
}

现在使用完全相同的方法:

keys.forEach(t -> {
    if (fields.contains(toCamel(t))) {
        System.out.println("Fields contain " + t);
    } else {
        System.out.println("Fields doesn't contain " + t);
    }
});

我可以用下划线替换所有小写字母,但我正在寻找更有效的方法。

使用 Set 作为 keysfields 的数据结构,这在查找中非常有效。此外,它适用于这个用例,因为在 JSON 中有重复的键是没有意义的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?