Рабочее решение, исправлены опечатки, благодаря @ Turing85
Java-8 Stream-API на самом деле не волшебная палочка для всего, и я не вижу простого решения с использованием лямбда-выражений.
Я предлагаю вам придерживаться процедурного пути:
String string = "1+5*2-4";
String[] operator = a.split("[0-9]+");
String[] digits = a.split("[+-\\/*]");
int reduced = Integer.parseInt(digits[0]);
for (int i = 1; i < digits.length; i++) {
if (operator[i].equals("+")) { reduced += Integer.parseInt(digits[i]); }
else if (operator[i].equals("/")) { reduced /= Integer.parseInt(digits[i]); }
else if (operator[i].equals("*")) { reduced *= Integer.parseInt(digits[i]); }
else if (operator[i].equals("-")) { reduced -= Integer.parseInt(digits[i]); }
}
Это решение упрощено только для целых чисел и без проверки ввода и последовательности символов.Число reduced
приводит к 8
.Кстати, не забывайте дважды экранировать символ /
с помощью \\
, потому что он имеет особое значение в регулярном выражении.
Если вы действительно настаиваете на решении на основе Stream-API, которое дает тот же результат, то вы идете:
String a = "1+5*2-4";
System.out.println(a);
String[] operator = a.split("[0-9]+");
String[] digits = a.split("[+-\\/*]");
final int[] index = {0};
int reduced = Stream.of(digits)
.mapToInt(Integer::parseInt)
.reduce(0, (int t, int u) ->
{
int result = Integer.parseInt(digits[0]);
int i = index[0];
if (operator[i].equals("+")) { result = t + u; }
else if (operator[i].equals("/")) { result = t / u; }
else if (operator[i].equals("*")) { result = t * u; }
else if (operator[i].equals("-")) { result = t - u; }
index[0]++;
return result;
});
Надеюсь, теперь вы можете сравнить обарезультаты, чтобы увидеть, какой из них выиграл в плане краткости и удобства обслуживания, что, на мой взгляд, важнее, чем показать, насколько вы хороши с Stream-API и лямбда-выражениями.Однако, если вы ставите перед собой задачу узнать больше о Stream-API, я предлагаю вам попытаться найти другие варианты использования.:)
РЕДАКТИРОВАТЬ: Кроме того, вы должны скрыть обработку цифр оператора для метода:
public static int process(int identity, int t, int u, String[] array, int index) {
int result = identity;
if (array[index].equals("+")) { result = t + u; }
else if (array[index].equals("/")) { result = t / u; }
else if (array[index].equals("*")) { result = t * u; }
else if (array[index].equals("-")) { result = t - u; }
return result;
}
Тогда я могу допустить, что Stream-API - не плохой выбор.
String a = "1+5*2-4";
System.out.println(a);
String operator[] = a.split("[0-9]+");
String digits[] = a.split("[+-\\/*]");
final int[] index = {0};
int reduced = Stream.of(digits).mapToInt(Integer::parseInt).reduce(0, (int t, int u) -> {
int result = process(Integer.parseInt(digits[0]), t, u, operator, index[0]);
index[0]++;
return result;
});