Java -- Ajuda

Ola pessoal, sou novo no ramo , e tenho muita dificuldade.
Alguém consegue me dar uma ajuda neste problema.
E

Elaborar um programa em Java para contar o total de letras que existem em uma mensagem, classificando quantas são maiúsculas, quantas são minúsculas e se houver números na mensagem indicar quantos números existem.

Você pode pegar caractere por caractere de uma String usando um for junto do método charAt.

char[] caracteres = new char[palavra.length];

// Vai percorrer todo a palavra e a adicionar ao array.
for (int i = 0; i < palavra.length; i++) {
    caracteres[i] = palavra.charAt(i);    
}

A classe Character vai te ajudar a verificar um determinado caractere. Ela possuí alguns métodos para saber se o caractere é maiúsculo, minúsculo ou um digíto, os métodos respectivamente são, isUpperCase, isLowerCase e isDigit.

// O retorno vai ser true.
System.out.println(Character.isUpperCase('C'));

Como alternativa para pegar a array de caracteres da string, você também pode usar o método toCharArray() , dessa forma:

char[] caracteres = str.toCharArray();

Basta fazer um loop pelos caracteres da string, testar se ele é letra maiúscula, minúscula ou dígito, e atualizar os respectivos contadores:

String texto = "O rato roeu a roupa do rei de Roma 123";
int maiusculas = 0, minusculas = 0, numeros = 0;
for (int i = 0; i < texto.length(); i++) { // para todos os caracteres da string
    char c = texto.charAt(i); // pegar o caractere
    if (Character.isUpperCase(c)) {
        maiusculas++;
    } else if (Character.isLowerCase(c)) {
        minusculas++;
    } else if (Character.isDigit(c)) {
        numeros++;
    }
}
System.out.printf("Total: %d letras maiúsculas, %d letras minúsculas, %d números\n", maiusculas, minusculas, numeros);

Vale lembrar que os métodos isLowerCase e isUpperCase também consideram letras de outros alfabetos (como por exemplo, 𐐌 e 𐐒). Só que estas letras possuem code points acima de U+FFFF (ou seja, não cabem em um char e acabam ocupando dois - leia aqui para entender melhor).

Se a string só tiver textos em português, pode usar o código acima. Mas para uma solução mais geral, pode mudar para:

String texto = "abc𐐌";
int maiusculas = 0, minusculas = 0, numeros = 0;
System.out.println(texto.codePointCount(0, texto.length()));
for (int i = 0; i < texto.codePointCount(0, texto.length()); i++) { // para todos os caracteres da string
    int c = texto.codePointAt(i); // pegar o caractere
    System.out.println("vendo " + c );
    if (Character.isUpperCase(c)) {
        maiusculas++;
    } else if (Character.isLowerCase(c)) {
        minusculas++;
    } else if (Character.isDigit(c)) {
        numeros++;
    }
}
System.out.printf("Total: %d letras maiúsculas, %d letras minúsculas, %d números\n", maiusculas, minusculas, numeros);

Coloquei o caractere 𐐌 na string para mostrar a diferença: teste com o primeiro código e ele dirá que tem zero letras maiúsculas, já usando o código acima, ele informa corretamente que há 1 letra maiúscula.

package com.gmail.roloje77.smallbig;

import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class App {
/*
* I use chars to get a Intstream from then String
* Then I map the int values to Character by using Character.valueOf()
* note int must be cast to a char
*
* * Eu uso caracteres para obter um “IntStream”
* Então mapeio os valores int para “Character” usando Character.valueOf()
* note que deve ser lançado para uma char
*/
private static Stream getStream(String text){
return text.chars(). // returns a IntStream
mapToObj(i -> Character.valueOf((char)(i)));//// convert a String to a Stream

}

public static void main(String[] args) {
	String s = "This is A test string with 56235 and %$@DepreCated.";
	

	// now I use the filter and  count methods of the Stream api
	// agora eu uso os métodos de filtro e contagem da API Stream
	long cap = 	getStream(s).filter(c -> (Character.isLetter(c) && Character.isUpperCase(c))).count();
	long small = getStream(s).filter(c -> (Character.isLetter(c) && Character.isLowerCase(c))).count();
	long dig = 	getStream(s).filter(c -> Character.isDigit(c)).count();
	System.out.printf("Upper case = %d\tlower case = %d\t digits = %d\n", cap,small,dig );
	
	// bonus to get a map with tow values say Upper and Lower case
	// bônus para obter um mapa com dois valores digamos maiúsculas e minúsculas
	Map<Boolean,Long> isUpper = getStream(s).collect(Collectors.partitioningBy(Character::isUpperCase,Collectors.counting()));
	System.out.println(isUpper);

}

}

//outputs
//Upper case = 4 lower case = 30 digits = 5
//{false=47, true=4}