Всем спокойного утра!
Сегодня я покажу вам очень крутую JAVA штучку, и сделаем полноценный калькулятор в пару строк.
Intro
И так, работать мы сегодня будем с JShell. Вы скажите, чел, это утилита командной строки(АНАЛог Python REPL). Да так и есть, но еще у нее есть JDK API(как то так), оно позволяет нам использовать JShell прямо в коде.
Начало
Долго тянуть не будем, поэтому сразу за код.
Создаем класс и главный метод, а в нем пишем:
try (JShell shell = JShell.create()) {
} catch (Exception e) {
e.printStackTrace();
}
И не забудте импортировать Необходимое:
import jdk.jshell.*;
import java.util.List;
Здесь мы инициализировали JShell.
Теперь дальше:
в этом же try-catch пишем:
List<SnippetEvent> ses = shell.eval("int i = 5 * 2;"); // любое Java выражение, или кусок кода.
for (SnippetEvent se : ses) {
System.out.println(se.value());
}
Здесь мы даем JShell API вычислить наш кусок кода, или выражение, а потом собираем результат.
Давайте напишем калькулятор!
И так. 2 класса.
начнем с первого, класс Calc.java:
// Импортируем JShell.
import jdk.jshell.JShell;
import jdk.jshell.Snippet;
import jdk.jshell.SnippetEvent;
import java.util.List;
public class Calc {
private final JShell shell = JShell.create(); // Создаем JShell.
public void shutdown() {
Runtime.getRuntime().addShutdownHook(new Thread(shell::close)); // Закрываем ее при завершении работы программы.
}
/**
* Метод, который решает уравнение, введеное пользователем. Сердце нашего калькулятора.
* @param input - Строка-уровнение, которую нужно вычеслить.
* @return - возвращает результат вычеслений.
*/
public String calc(String input) {
List<SnippetEvent> events = shell.eval("var x = " + input + ";");
SnippetEvent event = events.getFirst();
if (event.status() == Snippet.Status.VALID) { // Проверка на валидный ввод.
return event.value();
} else {
return "Error: invalid expression";
} // Вычисляем, и возвращаем резултат.
/*
.getFirst - потому что у нас очень простая задача, и там только 1 результат.
.value() - результат сниппета.
*/
}
}
Теперь класс Main.java:
//Импортируем сканер.
import java.util.Scanner;
public class Main {
/**
* Главныый метод программы.
* @param args - хз. Аргументы командной строки.
*/
public static void main(String[] args) {
// Создаем калькулятор.
Calc calc = new Calc();
calc.shutdown(); // вешаем задачю, чтобы закрыть наш "калькулятор"
// Scanner в try-with-resource, для автозакрытия.
try (Scanner scanner = new Scanner(System.in)) {
while (true) { // цикл для взаимодействия с пользователем.
String input = scanner.nextLine(); // Читаем строку.
if (input.equals("stop")) break;
System.out.println(calc.calc(input)); // Выводим результат.
}
}
}
}
Как видите, JShell - очень мощный инструмент.
Спасибо за внимание, надеюсь было интересно.
P.S На питоне* так можно было сделать в одну строку:
while True: print(eval(input('Ввел пример, быстро.')))
* Сделан для геев, и запрещен у настоящих мужиков.
Hilo Всем спокойного утра!
2 mensajes · –0