@ZachC said in Straightforward Java 8 main lines 25ms:

i >= 0 || j >= 0 || carry == 1

Wow!

I got a similar idea with you but your solution is much much cleaner!

public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
while (i >= 0 && j >= 0) {
int digit1 = num1.charAt(i) - '0';
int digit2 = num2.charAt(j) - '0';
int sum = digit1 + digit2 + carry;
carry = 0;
if (sum >= 10) carry = 1;
sb.append((sum % 10) + "");
i--;
j--;
}
while (j >= 0) {
int digit = num2.charAt(j) - '0' + carry;
carry = 0;
if (digit >= 10) carry = 1;
sb.append(digit % 10 + "");
j--;
}
while (i >= 0) {
int digit = num1.charAt(i) - '0' + carry;
carry = 0;
if (digit >= 10) carry = 1;
sb.append(digit % 10 + "");
i--;
}
if (carry != 0) {
sb.append(carry + "");
}
return sb.reverse().toString();
}