How to check whether a given integer is prime number or not ?

This is the complete solution to check whether a given integer number is prime or not. This solution is designed to to solve the problem using an interface, super class and four derived classes implementing the interface. The core logic is to check the divisibility of the given number, from 2 to till the square root of the given number.

package pack1;

/* Declare an interface PrimeInf with the following methods */
public interface PrimeIntf {
	
		/* Define the functional interface with SAM 'PrimeCheck' */
		boolean PrimeCheck(Integer intValue);

		/* Define the static method 'displayMsg' */
		static void displayMsg(boolean trueOrFalse, int num) {

			if (num != 0) {
				if (trueOrFalse)
					System.out.println("The Number '"+num+"' is Prime\n\n");
				else
					System.out.println("The Number '"+num+"' is not Prime\n\n");
			}else
				System.out.println("The Number '"+num+"' is  neither a Prime nor a Composite\n\n");
		}
}

package pack1;

import java.util.Optional;
import java.util.function.Predicate;
import java.util.logging.Logger;
import java.util.stream.IntStream;

class PrimeInputs {

	private Integer intValue;
	
	/* Declare the logger object for the class to display the log messages */
	static Logger logger = Logger.getLogger(PrimeInputs.class.getName());

	@SuppressWarnings("null")
	public boolean validateInputs(Integer intVal) {

		/* Fetch the class object's name from which this method is called */
		String cName = Thread.currentThread().getStackTrace()[2].getClassName();
		String mName = "validateInputs";
		logger.info("This method '" + mName + "' called from the Class '" + cName + "'");

		/* Validating the function parameters using Optional String data type methods */
		Optional<Integer> intValue = Optional.ofNullable(intVal);
	
		/*
		 * Fetch the value of the Optional String parameters using 'isPresent' condition
		 * check. If the value is available use 'get' method otherwise simply assign
		 * 'null' to the 'intValue' variable using setter method.
		 */
		if (intValue.isPresent())
			setIntValue(intValue.get());
		else
			setIntValue((Integer) null);
	
		logger.info("The input is validated Successfully");
		return true;
	}

	public int getIntValue() {
		return intValue.intValue();
	}

	public void setIntValue(int intValue) {
		this.intValue = intValue;
	}
}

class PrimeChk_Using_Corelogic extends PrimeInputs implements PrimeIntf {

	@Override
	public boolean PrimeCheck(Integer intVal) {

		System.out.println("Checking whether this number '"+intVal+"' is Prime or not");
		/* Fetch the class object's name from which this method is called */
		String cName = Thread.currentThread().getStackTrace()[2].getClassName();
		String mName = "PrimeCheck";
		logger.info("This method '" + mName + "' called from the Class '" + cName + "'");
		boolean isPrime=true;
		
		/* Check for NullPointerException, if input is null set isPRime=false*/
			try {
				if (validateInputs(intVal)) {
					/* Check for special number 0, if it is set isPRime=false */
					if (intVal!=0) {
					/* Initialize the lower and upper boundary values in the for loop */
					    int bvalToCheck = (int) Math.sqrt(getIntValue());
					    for(int i=2;i<=bvalToCheck;i++) {
					        if(getIntValue()%i==0) {
					        	isPrime=false;
					            break;
					        }               
					    }
					} else
						isPrime=false;
				}
			/* Handling nulls here during Runtime */
			} catch (NullPointerException e) {
				logger.info("The input is validated Successfully");
				logger.warning("The given Input is '"+intVal+"'\n");
				isPrime=false;
    			return isPrime;
			}
		PrimeIntf.displayMsg(isPrime,getIntValue());
		return isPrime;
	}
}

class PrimeChk_Using_Predicates extends PrimeInputs implements PrimeIntf {

	@Override
	public boolean PrimeCheck(Integer intVal) {

		System.out.println("Checking whether this number '"+intVal+"' is Prime or not");
		/* Fetch the class object's name from which this method is called */
		String cName = Thread.currentThread().getStackTrace()[2].getClassName();
		String mName = "PrimeCheck";
		logger.info("This method '" + mName + "' called from the Class '" + cName + "'");
		boolean isPrime=true;
		 
        /* Define a basic predicate which checks reminder value */
        Predicate<Integer> reminderEqualsToZero = i -> (getIntValue()%i==0);
 
        /* Check for NullPointerException, if input is null set isPRime=false*/
		try {
			if(validateInputs(intVal)) {
				/* Check for special number 0, if it is set isPRime=false */
				if (intVal!=0) {
				    //Initialize the highest boundary in the for loop
					    int upperBoundary = getIntValue()/2;
					    for(int num=2;num<=upperBoundary;num++) {
					        if (reminderEqualsToZero.test(num)) {
					            isPrime=false;
					            break;
					        }                        
					    }
				} else
					isPrime=false;	
			}
			/* Handling nulls here during Runtime */
        	} catch (NullPointerException e) {
        			logger.info("The input is validated Successfully");
        			logger.warning("The given Input is '"+intVal+"'\n");
        			isPrime=false;
        			return isPrime;
				}
        PrimeIntf.displayMsg(isPrime,getIntValue());
		return isPrime;
	}
}

class PrimeChk_Using_LambdaExpression extends PrimeInputs implements PrimeIntf {
	
	 /* Define the Lambda expression for the functional interface 'Prime' */
    PrimeIntf Cp = ((num) -> {
         
        /* Initialize the lower and upper boundary values in the for loop */
        int bvalToCheck = (int) Math.sqrt(num);
        for(int i=2;i<=bvalToCheck;i++)
            if(num%i==0) {
    			return false;
            }
        return true;
    });

	@Override
	public boolean PrimeCheck(Integer intVal) {

		System.out.println("Checking whether this number '"+intVal+"' is Prime or not");
		/* Fetch the class object's name from which this method is called */
		String cName = Thread.currentThread().getStackTrace()[2].getClassName();
		String mName = "PrimeCheck";
		logger.info("This method '" + mName + "' called from the Class '" + cName + "'");
		boolean status = false;
		
		/* Check for NullPointerException, if input is null set isPRime=false*/
		try {
			if (validateInputs(intVal)) {
				/* Check for special number 0, if it is set isPRime=false */
				if (intVal==0)
					status=false;
				else
					status = Cp.PrimeCheck(intVal);
			}
    		else 
    			status = true;
		}
		/* Handling nulls here during Runtime */
		catch (NullPointerException e) {
			logger.info("The input is validated Successfully");
			logger.warning("The given Input is '"+intVal+"'\n");
			status=false;
			return status;
		}
		PrimeIntf.displayMsg(status,getIntValue());
		return status;
	}
}

class PrimeChk_Using_Stream extends PrimeInputs implements PrimeIntf {

	@Override
	public boolean PrimeCheck(Integer intVal) {

		System.out.println("Checking whether this number '"+intVal+"' is Prime or not");
		/* Fetch the class object's name from which this method is called */
		String cName = Thread.currentThread().getStackTrace()[2].getClassName();
		String mName = "PrimeCheck";
		logger.info("This method '" + mName + "' called from the Class '" + cName + "'");
		boolean isPrime=true;
		
		/* Check for NullPointerException, if input is null set isPRime=false*/
		try {
			if (validateInputs(intVal)) {
				/* Check for special number 0, if it is set isPRime=false */
				if (intVal!=0) {
						if (IntStream
								.range(2, (int) Math.sqrt(intVal.intValue()))
										.noneMatch(idx->intVal.intValue()%idx==0))
							isPrime=true;
						else 
							isPrime=false;
				} else
					isPrime=false;
			}
			/* Handling nulls here during Runtime */
        	} catch (NullPointerException e) {
        			logger.info("The input is validated Successfully");
        			logger.warning("The given Input is '"+intVal+"'\n");
        			isPrime=false;
        			return isPrime;
				}
        PrimeIntf.displayMsg(isPrime,getIntValue());
		return isPrime;
	}
}

public class PrimeJ8 {
	
	public static void main(String[] args) {
	
		/*
		 * create the class object PrimeChk_Using_Corelogic, and call the method
		 * PrimeCheck
		 */
		PrimeChk_Using_Corelogic PUcore = new PrimeChk_Using_Corelogic();
		PUcore.PrimeCheck(71);
		PUcore.PrimeCheck(null);
		PUcore.PrimeCheck(0x56);
		/*
		 * create the class object PrimeChk_Using_Predicates, and call the method
		 * PrimeCheck
		 */
		PrimeChk_Using_Predicates PUpredicate = new PrimeChk_Using_Predicates();
		PUpredicate.PrimeCheck(82);
		PUpredicate.PrimeCheck(null);
	
		/*
		 * create the class object PrimeChk_Using_LambdaExpression, and call the
		 * method PrimeCheck
		 */
		PrimeChk_Using_LambdaExpression PrimeUL = new PrimeChk_Using_LambdaExpression();
		PrimeUL.PrimeCheck(92);
		PrimeUL.PrimeCheck(null);
		/*
		 * create the class object PrimeChk_Using_Streams, and call the
		 * method PrimeCheck
		 */
		PrimeChk_Using_Stream PrimeUS = new PrimeChk_Using_Stream();
		PrimeUS.PrimeCheck(107);
		PrimeUS.PrimeCheck(null);
	}
}
OUTPUT:
Checking whether this number '71' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Corelogic PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_Corelogic'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: The input is validated Successfully
The Number '71' is Prime


Checking whether this number 'null' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Corelogic PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_Corelogic'
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Corelogic PrimeCheck
INFO: The input is validated Successfully
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Corelogic PrimeCheck
WARNING: The given Input is 'null'

Checking whether this number '86' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Corelogic PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_Corelogic'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: The input is validated Successfully
The Number '86' is not Prime


Checking whether this number '82' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Predicates PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_Predicates'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: The input is validated Successfully
The Number '82' is not Prime


Checking whether this number 'null' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Predicates PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_Predicates'
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Predicates PrimeCheck
INFO: The input is validated Successfully
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Predicates PrimeCheck
WARNING: The given Input is 'null'

Checking whether this number '92' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_LambdaExpression PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_LambdaExpression'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: The input is validated Successfully
The Number '92' is not Prime


Checking whether this number 'null' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_LambdaExpression PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_LambdaExpression'
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_LambdaExpression PrimeCheck
INFO: The input is validated Successfully
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_LambdaExpression PrimeCheck
WARNING: The given Input is 'null'

Checking whether this number '107' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Stream PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_Stream'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: The input is validated Successfully
The Number '107' is Prime


Checking whether this number 'null' is Prime or not
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Stream PrimeCheck
INFO: This method 'PrimeCheck' called from the Class 'pack1.PrimeJ8'
Jan 08, 2023 6:30:24 AM pack1.PrimeInputs validateInputs
INFO: This method 'validateInputs' called from the Class 'pack1.PrimeChk_Using_Stream'
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Stream PrimeCheck
INFO: The input is validated Successfully
Jan 08, 2023 6:30:24 AM pack1.PrimeChk_Using_Stream PrimeCheck
WARNING: The given Input is 'null'

The link to the JUnit5 test for this solution is here – https://atomic-temporary-185308886.wpcomstaging.com/2023/01/08/junit-test-for-primecheck/