How to find String Palindrome check of the given given String ?

This is the complete solution to find the String Palindrome check from the given String. The solution consists of a functional interface, super class and a couple of derived classes implementing the interface.

package migrate;

import java.util.HashMap;

public interface StringPalindromeIntf {

	//Defining the functional interface with SAM 'Palindrome'
	public HashMap<String, String> Palindrome(String str);
	
	//Static method of the interface, getting invoked directly with the interface name only
	static void displayMsg(String Str, String isPalin) {
		try {
			if (Str != null) {
				if (!isPalin.equalsIgnoreCase("error")) {
					if (isPalin.equalsIgnoreCase("yes")) {
						System.out.println("The String= " + Str + " is Palindrome");
					} else {
						System.out.println("The String= " + Str + " is not a Palindrome");
					}
				} else {
					System.out.println("There might be some issue with the code\n");
				}
			} else {
				System.out.println("The given string is null\n");
			}
		} catch (NullPointerException npx) {
			System.out.println("NullPointerException:: " + npx.getMessage());
		}
	}
}
package migrate;

import java.util.HashMap;
import java.util.Optional;
import java.util.logging.Logger;

class StringInput {

	private String finaStr;
	HashMap<String, String> strStatus = new HashMap<>();
	static Logger logger = Logger.getLogger(StringInput.class.getName());

	// Validating the input received from the derived classes
	public boolean validateInput(String strValue) {

		// Logging the details of the called class and the current method name
		String cName = Thread.currentThread().getStackTrace()[2].getClassName();
		String mName = Thread.currentThread().getStackTrace()[1].getMethodName();
		logger.info("This method " + mName + " called from " + cName);
		Optional<String> str = Optional.ofNullable(strValue);

		// Doing the null check using the Optional class
		if (str.isPresent()) {
			setFinaStr(str.get());
			return true;
		} else {
			setFinaStr(null);
			return false;
		}
	}

	public String getFinaStr() {
		return finaStr;
	}

	public void setFinaStr(String finaStr) {
		this.finaStr = finaStr;
	}
}

class Palindrome_Check_Using_LambdaExp extends StringInput implements StringPalindromeIntf {

	// Using the functional interface to define the Lambda expression
	StringPalindromeIntf palinIntf = ((str) -> {

		try {

			String tmp = "";
			int len = str.length() - 1;
			while (len >= 0) {
				tmp += str.charAt(len);
				len -= 1;
			}

			if (tmp.equalsIgnoreCase(str)) {
				strStatus.put(str, "yes");
			} else {
				strStatus.put(str, "no");
			}
		} catch (StringIndexOutOfBoundsException arx) {
			System.out.println("StringIndexOutOfBoundsException:: " + arx.getMessage());
			strStatus.put(str, "error");
		} finally {
			System.out.println("Palindrome Check Completed");

		}
		return strStatus;
	});

	@Override
	public HashMap<String, String> Palindrome(String str) {

		// Logging the details of the called class and the current method name
		String cName = Thread.currentThread().getStackTrace()[2].getClassName();
		String mName = Thread.currentThread().getStackTrace()[1].getMethodName();
		logger.info("This method " + mName + " called from the class " + cName);

		if (validateInput(str)) {
			StringPalindromeIntf.displayMsg(str, palinIntf.Palindrome(str).get(str));
		} else {
			strStatus.put(str, null);
			StringPalindromeIntf.displayMsg(str, strStatus.get(str));
		}
		return strStatus;
	}
}

class Palindrome_Check_Using_StringBuffer extends StringInput implements StringPalindromeIntf {

	@Override
	public HashMap<String, String> Palindrome(String str) {

		// Logging the details of the called class and the current method name
		String cName = Thread.currentThread().getStackTrace()[2].getClassName();
		String mName = Thread.currentThread().getStackTrace()[1].getMethodName();
		logger.info("This method " + mName + " called from the class " + cName);

		if (validateInput(str)) {
			StringBuffer strBuf = new StringBuffer(str);

			if ((strBuf.reverse().toString()).equalsIgnoreCase(str)) {
				strStatus.put(str, "yes");
			} else {
				strStatus.put(str, "no");
			}
			StringPalindromeIntf.displayMsg(str, strStatus.get(str));

		} else {
			strStatus.put(str, null);
			StringPalindromeIntf.displayMsg(str, strStatus.get(str));
		}
		return strStatus;
	}
}

public class StringPalindrome {

	public static void main(String[] args) {

		// Instantiation of the object using the class Palindrome_Check_Using_LambdaExp
		Palindrome_Check_Using_LambdaExp PCUL = new Palindrome_Check_Using_LambdaExp();
		PCUL.Palindrome("TESET");
		PCUL.Palindrome("HowoH");
		PCUL.Palindrome(null);

		// Instantiation of the object using the class
		// Palindrome_Check_Using_StringBuffer
		Palindrome_Check_Using_StringBuffer PCUSB = new Palindrome_Check_Using_StringBuffer();
		PCUSB.Palindrome("Not");
		PCUSB.Palindrome(null);
		PCUSB.Palindrome("SKYKS");
	}
}

OUTPUT:

Mar. 16, 2024 3:37:40 P.M. migrate.Palindrome_Check_Using_LambdaExp Palindrome
INFO: This method Palindrome called from the class migrate.StringPalindrome
Mar. 16, 2024 3:37:40 P.M. migrate.StringInput validateInput
INFO: This method validateInput called from migrate.Palindrome_Check_Using_LambdaExp
Palindrome Check Completed
The String= TESET is Palindrome
Mar. 16, 2024 3:37:40 P.M. migrate.Palindrome_Check_Using_LambdaExp Palindrome
INFO: This method Palindrome called from the class migrate.StringPalindrome
Mar. 16, 2024 3:37:40 P.M. migrate.StringInput validateInput
INFO: This method validateInput called from migrate.Palindrome_Check_Using_LambdaExp
Palindrome Check Completed
The String= HowoH is Palindrome
Mar. 16, 2024 3:37:40 P.M. migrate.Palindrome_Check_Using_LambdaExp Palindrome
INFO: This method Palindrome called from the class migrate.StringPalindrome
Mar. 16, 2024 3:37:40 P.M. migrate.StringInput validateInput
INFO: This method validateInput called from migrate.Palindrome_Check_Using_LambdaExp
The given string is null

Mar. 16, 2024 3:37:40 P.M. migrate.Palindrome_Check_Using_StringBuffer Palindrome
INFO: This method Palindrome called from the class migrate.StringPalindrome
Mar. 16, 2024 3:37:40 P.M. migrate.StringInput validateInput
INFO: This method validateInput called from migrate.Palindrome_Check_Using_StringBuffer
The String= Not is not a Palindrome
Mar. 16, 2024 3:37:40 P.M. migrate.Palindrome_Check_Using_StringBuffer Palindrome
INFO: This method Palindrome called from the class migrate.StringPalindrome
Mar. 16, 2024 3:37:40 P.M. migrate.StringInput validateInput
INFO: This method validateInput called from migrate.Palindrome_Check_Using_StringBuffer
The given string is null

Mar. 16, 2024 3:37:40 P.M. migrate.Palindrome_Check_Using_StringBuffer Palindrome
INFO: This method Palindrome called from the class migrate.StringPalindrome
Mar. 16, 2024 3:37:40 P.M. migrate.StringInput validateInput
INFO: This method validateInput called from migrate.Palindrome_Check_Using_StringBuffer
The String= SKYKS is Palindrome

The link to the JUnit5 test for this solution is here – https://atomic-temporary-185308886.wpcomstaging.com/2024/03/17/string-palindrome-junittest/