User details logging I have written this logic for logging, but is getting replication for all fields (last name, DOB,city, state, ZIP, etc). Here only validation logic is going to differ, whereas logging functionality will remain the same.
public boolean validFirstName(UserInputDetails record) {
        if (CommonUtil.isNullOrEmpty(record.getFirstName())) {
            record.setErrorCode(ErrorCodes.FIRSTNAME_NULL.getErrorCode());
            if(record.isDetailedLoggingEnabled()){
                Map&lt;String,String&gt; dtlLogMap = new HashMap&lt;&gt;(5);
                dtlLogMap.put(&quot;transId&quot;,String.valueOf(record.getTransactionId()));
                dtlLogMap.put(&quot;firstName&quot;,record.getFirstName());
                dtlLogMap.put(&quot;validationName&quot;,&quot;VALID_FIRSTNAME_CHECK&quot;);
                dtlLogMap.put(&quot;validationStatus&quot;,&quot;Errored&quot;);
                dtlLogMap.put(&quot;errorCode&quot;,record.getErrorCode());
                DetailedLogger.log(dtlLogMap);
            }
            return false;
        }
        
        if ( record.getFirstName().length() &gt;=50) {
            record.setErrorCode(ErrorCodes.FIRSTNAME_INVALID_LENGTH.getErrorCode());
            if(record.isDetailedLoggingEnabled()){
                Map&lt;String,String&gt; dtlLogMap = new HashMap&lt;&gt;(6);
                dtlLogMap.put(&quot;transId&quot;,String.valueOf(record.getTransactionId()));
                dtlLogMap.put(&quot;firstName&quot;,record.getFirstName());
                dtlLogMap.put(&quot;firstNameLength&quot;,returnStringifNotNull(record.getFirstName().length()));
                dtlLogMap.put(&quot;validationName&quot;,&quot;VALID_FIRSTNAME_LENGTH_CHECK&quot;);
                dtlLogMap.put(&quot;validationStatus&quot;,&quot;Errored&quot;);
                dtlLogMap.put(&quot;errorCode&quot;,record.getErrorCode());
                DetailedLogger.log(dtlLogMap);
            }
            return false;
        }
        if(record.isDetailedLoggingEnabled()){
            Map&lt;String,String&gt; dtlLogMap = new HashMap&lt;&gt;(4);
            dtlLogMap.put(&quot;transId&quot;,String.valueOf(record.getTransactionId()));
            dtlLogMap.put(&quot;firstName&quot;,record.getFirstName());
            dtlLogMap.put(&quot;validationName&quot;,&quot;VALID_FIRSTNAME_CHECK&quot;);
            dtlLogMap.put(&quot;validationStatus&quot;,&quot;passed&quot;);
            DetailedLogger.log(dtlLogMap);
        }
        return true;
    }
as mentioned in the comments it might be helpful to extract methods to remove redundant code - you might want to read a more detailed explanation on &quot;methods in java&quot; to gain basic knowledge on methods.
tl;dr
&quot;A Java method is a collection of statements that are grouped together to perform an operation&quot;
let's collect your your statements that all checks have in common
Map&lt;String,String&gt; dtlLogMap = new HashMap&lt;&gt;(4);
dtlLogMap.put(&quot;transId&quot;,String.valueOf(record.getTransactionId()));
dtlLogMap.put(&quot;firstName&quot;,record.getFirstName());
dtlLogMap.put(&quot;validationName&quot;,&quot;VALID_FIRSTNAME_CHECK&quot;);
dtlLogMap.put(&quot;validationStatus&quot;,&quot;passed&quot;);
DetailedLogger.log(dtlLogMap);

we can extract a lot of stuff here into a method named Map&lt;String,String&gt; createLog(Record record, String checkResult) - noteworthy is, that we only group things together, that belong together - we do not (yet) extract the logging action - to maintain the Single Responsibility-principle. That makes it also a lot easier to find proper method names (instead of creating an obfucasting method name createAndPrintLog())
private Map&lt;String,String&gt; createLog(Record record, String checkName, String checkResult){
    Map&lt;String,String&gt; logs= new HashMap&lt;&gt;(4);
    logs.put(&quot;transId&quot;,String.valueOf(record.getTransactionId()));
    logs.put(&quot;firstName&quot;,record.getFirstName());
    logs.put(&quot;validationName&quot;,checkName);
    logs.put(&quot;validationStatus&quot;,checkResult);
    return logs;
}

note that a method has parameters that let you control the output of the method: the parameters should be self-explaining (Tell - dont Ask)
we can now apply this method in your checks and remove redundant code
...
if(record.isDetailedLoggingEnabled()){
    //here: method call instead of redundancy
    Map&lt;String,String&gt; dtlLogMap = createLogs(record,&quot;VALID_FIRSTNAME_CHECK&quot;,  &quot;Errored&quot;);
    dtlLogMap.put(&quot;errorCode&quot;,record.getErrorCode());
    DetailedLogger.log(dtlLogMap);
}
...

use more methods to remove more reduncancy!