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

Java - check if under_score string is in a list of lowerCamel strings

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

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

我正在 Java 中寻找一种有效的方法来检查 key 是否在 fields 中,我希望以下内容为 return 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 from 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);
    }
});

I could just replace all lowerCase with underscore, but I'm looking for more efficient way of doing this.

使用Set作为keysfields的数据结构,在查找时非常有效。此外,它适用于此用例,因为在 JSON.

中有重复的键是没有意义的