Функция внутри функции в Java
код функции 2 появляется три раза в fun1 в моем коде (это большая функция для сопоставления биржевых заказов (мое школьное задание)) и использует много локальных переменных fun1.
так в чем проблема с двумя не вложенными методами? Затем просто вызывайте function2 столько раз, сколько вы хотите внутри function1
В Java просто нет такого понятия как функция. Существуют только объекты и методы, которые полностью принадлежат объектам и подчиняются им. Объект ваш господин и хозяин в Java, ничего не происходит, кроме как по его воле.
@Hunter, если я определю fun2 вне fun1, он не сможет изменять переменные fun1. когда я компилирую это выдаст ошибку, которая не может найти символ
Можно сказать, что Java представляет даже определение класса как просто еще один тип объекта для программиста 🙂
2 ответа
Вы не можете (и в Java они называются методами).
Однако вы можете определить анонимный класс внутри метода и вызвать его методы.
На мой взгляд, есть разница между методами и функциями, в то время как функции живут сами по себе, методы связаны с классом или объектом.
Разъяснение полезно, так как все документы Java используют это понятие. Жесткий (или кто-либо еще) найдет ответ на будущие вопросы о методах проще с правильным именованием.
Причина, по которой вы не можете сделать этого, состоит в том, что функции должны быть приложены к классу. В отличие от JavaScript и подобных языков, функции не являются типом данных. Есть движение, чтобы превратить их в один, чтобы поддерживать закрытие в Java (надеюсь, в Java 8), но с Java 6 и 7 он не поддерживается. Если вы хотите сделать что-то подобное, вы можете сделать это:
interface MyFun < void fun2(); >public static boolean fun1() < MyFun fun2 = new MyFun() < public void fun2() < //. >>; fun2.fun2(); return returnValue; >
Ещё вопросы
- 0 Ошибка компоновщика с шаблонным классом
- 0 JS не работает на ПК, но работает на JSFIddle
- 0 скольжение переполняется, пока слайд и слайд используются постоянно
- 1 TFS Changeset несколькими пользователями
- 0 Автоматическая проблема с перенаправлением в iframe
- 0 Передача переменной из .htaccess на страницу PHP
- 0 Python утилизация данных с неправильной HTML-структурой
- 1 Как загрузить открытый набор данных s3 в коллаборацию Google?
- 0 Как вывести результат $ last ngRepeat из href?
- 0 Использование CASE в Mysql для установки значения в поле Alias
- 1 Как автоматически обновить экран графического интерфейса в Java, после того, как обновление происходит в сохраненном файле?
- 0 Как я могу поделиться переменными между представлениями, с тем же контроллером в AngularJS?
- 1 как получить значения строки, когда флажок установлен в gridview
- 1 Почему TextView не может отображать форматированный текст, ссылающийся на ресурсы Android?
- 0 Выполнение запроса MySQL с использованием Python MySQL?
- 0 PHP Regexp для получения переменной = «значение» из строки
- 1 Альтернативное кодирование относительно isConnectingOrConnecting?
- 0 Как мне иметь более одной переменной?
- 0 Вызовите C ++ на стороне сервера с веб-страницы
- 1 Второй цикл не выполняется
- 1 Полный список цветов Excel с xlsxwriter
- 1 На уровне модели, это хорошая идея для составления типов с идентификаторами, в отличие от прямых ссылок?
- 1 Изменить текст на жирный или добавить изображения с помощью Google Script
- 0 Как изменить опцию выбора выпадающего списка при onclick ()?
- 1 Office 365 надстройка Javascript — синтез речи
- 1 Возникли проблемы с этим методом, ошибка компиляции
- 1 регулярное выражение совпадение строки с шаблоном
- 1 Кнопки Python Tkinter numpad и несколько входов
- 0 Как мне сделать конструктор, который принимает любой примитивный тип и преобразует в int в c ++?
- 0 Как извлечь только определенную дату-время из веб-ответа и сопоставить его с данной датой-временем?
- 0 Я не могу получить доступ к определенным ресурсам (параметры URL) Java
- 0 MySQL JSON_SEARCH — не работает с двойными кавычками
- 1 Доступ к кодам категорий для объектов Index в Pandas
- 0 Как изменить строки со столбцами в матрице с одинаковой шириной?
- 1 Ошибка распознавания токена в: ‘#i’ при разборе грамматики c
- 0 Горизонтальная страница контента Windows 8
- 0 Как получить доступ к одному действию контроллера внутри другого действия контроллера?
- 1 Сеть d3 с несколькими ссылками в одном направлении
- 1 Несколько графиков на одной странице, ошибка масштаба в D3.js
- 1 Python — ускорить итерацию панд
- 0 Tinymce форматирует текстовую область с помощью HTML. Не отображается в DOM?
- 1 d3.js: групповые аккорды на диаграмме одним цветом
- 1 Как в нижнем регистре все буквы, кроме первой буквы в TabLayout?
- 0 угловой контроллер несколько раз
- 0 Синтаксическая ошибка хранимой процедуры MySQL: если еще
- 1 Возможная ошибка с внедрением зависимости на MvvmCross
- 0 Я должен обновить страницу AngularJS, чтобы увидеть, добавил ли я что-то
- 0 JQuery TableSorter не сортирует вторую таблицу
- 1 генерировать данные из базы данных в Excel с помощью Python, но дата и время в Excel не правильный формат
- 0 Вырезать URL-адрес изображения API Facebook
Как передать функцию в функцию java
Передать функцию в качестве параметра в другую функцию можно разными способами. Рассмотрим некоторые из них.
1) Воспользуемся функциональным интерфейсом Predicate :
import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; public class App public static void main(String[] args) ListString> list1 = List.of("1", "22", "333", "4444"); ListString> filteredList1 = filterList(list1, x -> x.length() >= 3); System.out.println(filteredList1); // => [333, 4444] ListInteger> list2 = List.of(1, 2, 3, 4); ListInteger> filteredList2 = filterList(list2, x -> x >= 3); System.out.println(filteredList2); // => [3, 4] > public static T> ListT> filterList(ListT> list, PredicateT> rool) return list.stream() .filter(x -> rool.test(x)) .collect(Collectors.toList()); > >
2) Воспользуемся готовым функциональным интерфейсом UnaryOperator :
public static void superMethod(UnaryOperatorString> method) String str = "Hexlet"; String result = method.apply(str); System.out.println(result); > // вызов с передачей методов public class App public static void main(String[] args) throws Exception // передадим стандартный метод superMethod(String::toUpperCase); // => HEXLET // передадим лямбда-функцию superMethod(s -> s + "!"); // => hexlet! // передадим собственный метод superMethod(App::reverse); // => telxeh > public static String reverse(String str) StringBuilder builder = new StringBuilder(); builder.append(str); return builder.reverse().toString(); > >
3) Создадим собственный интерфейс и передадим объект этого типа в нашу функцию :
interface MyInterface int count(int a, int b, int c); > public static void superMethodInterface(MyInterface method) int a = 5, b = 10, c = 20; int result = method.count(a, b, c); System.out.println(result); > // вызов с передачей методов public class App public static void main(String[] args) throws Exception MyInterface count = new MyInterface() @Override public int count(int a, int b, int c) return a + b + c; > >; superMethodInterface(count); // => 35 superMethodInterface((a,b,c) -> a * b * c); // => 1000 superMethodInterface((a,b,c) -> a + b - c); // => -5 > >
4) Получим метод с помощью рефлексии и передадим его :
public static void superMethodReflection(Object object, Method method) throws Exception int a = 10; int b = 20; int result = (int) method.invoke(object, a, b); System.out.println(result); > // вызов с передачей методов public class App public static void main(String[] args) throws Exception // передадим стандартный метод Method method = Integer.class.getDeclaredMethod("max", int.class, int.class); superMethodReflection(0, method); // => 20 method = Integer.class.getDeclaredMethod("sum", int.class, int.class); superMethodReflection(0, method); // => 30 // передадим собственный метод method = App.class.getDeclaredMethod("concate", int.class, int.class); superMethodReflection(new App(), method); // => 1020 > public static int concate(int a, int b) return Integer.parseInt("" + a + b); > >