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

Java-检查under_score字符串是否在lowerCamel字符串列表中,java,collections,java-stream,camelcasing,Java,Collections,Java Stream,Camelcasing,请考虑_score和fields lowerCamel下的以下键: keys = ["opened_by","ticket_owner","close_reason"] fields = ["openedBy","ticketOwner","closeReason"] 我正在寻找一种在Java中检查键是否位于字段中的有效方法,我希望以下内容返回true: 我的代码: Se

请考虑_score和fields lowerCamel下的以下键:

keys   = ["opened_by","ticket_owner","close_reason"]
fields = ["openedBy","ticketOwner","closeReason"]
我正在寻找一种在Java中检查键是否位于字段中的有效方法,我希望以下内容返回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
            }
        });
我可以用下划线替换所有小写字母,但我正在寻找更有效的方法。

尝试使用from

试用


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

设置字段=Arrays.streamTicketIncidentDTO.class.getDeclaredFields .mapField::getName .mapString::toLowerCase .toSet; responseJson.keySet .filterkey->fields.containskey.replaceAll\, .forEachkey->{ //做点什么。。 };
如果您没有像abcXyz abc_xyz和abcXyz ab_cxyz这样拼写相同但单词组合不同的字段,那么一种解决方案是将u替换为空,然后使用equalsIgnoreCase与字段名进行比较。另一个类似的解决方案是将每个字段名转换为小写,然后在将u替换为后将其与驼峰大小写字符串进行比较。与第一种方法相比,这可能会消除额外循环的使用

设置字段=Arrays.streamTicketIncidentDTO.class.getDeclaredFields .mapField::getName .mapString::toLowerCase .toSet; responseJson.keySet .filterkey->fields.containskey.replaceAll\, .forEachkey->{ //做点什么。。 }; 一种简单的toCamel方法:

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

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

一个简单的toCamel方法:

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


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

这能解决您的问题吗?谢谢,但不完全是,我可以用下划线替换所有小写字母,但我正在寻找更有效的方法。可能是一些忽略大小写格式的方法或类似的方法。默认情况下,集合、映射调用equals方法。这里没有简单的问题。要么实现使用不同类型比较的非常特殊的集合,要么咬紧牙关,保留多个包含这些已转换ID的集合。请注意,忽略大小写并没有真正的帮助,因为它会导致比较失败。您能否澄清一下,您认为用下划线替换小写字母效率太低的原因?在我看来,您有两种选择:1最初将字段转换为下划线而不是CamelCase符号;2保持字段不变,并在每次查找期间将键从下划线转换为CamelCase符号。如果你有相对较少的字段和较多的查找,那么方法1是最有效的方法。这能解决你的问题吗?谢谢,但不完全是,我可以用下划线替换所有小写字母,但我正在寻找更有效的方法。可能是一些忽略大小写格式的方法或类似的方法。默认情况下,集合、映射调用equals方法。这里没有简单的问题。要么实现使用不同类型比较的非常特殊的集合,要么咬紧牙关,保留多个包含这些已转换ID的集合。请注意,忽略大小写并没有真正的帮助,因为它会导致比较失败。您能否澄清一下,您认为用下划线替换小写字母效率太低的原因?在我看来,您有两种选择:1最初将字段转换为下划线而不是CamelCase符号;2保持字段不变,并在每次查找期间将键从下划线转换为CamelCase符号。如果您有相对较少的字段和许多查找,那么方法1是最有效的方法。
Set<String> incidentFields = Arrays
            .stream(TicketIncidentDTO.class.getDeclaredFields())
            .map(Field::getName)
            .collect(Collectors.toSet()
            );


responseJson.keySet().forEach(key ->{
           
            if (incidentFields.contains(key)) 
            {
                //Do something
            }
        });
// 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);
    }
});
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);
    }
});