Категория ‘ПИК3 Java’
* Генератори на функции (Currying) в Java 8
Публикувано на 14 март 2015 в раздел ПИК3 Java.
Ако имаме една функция от няколко входни параметри, която като резултат връща друга функция с по-малко параметри, ще казваме, че имаме "генератор на функции". Терминът на английски се нарича "currying" и е важен за функционалното програмиране. Нека разгледаме един пример за генератор на функция, който е написан на по-стара версия на Java (<=7). Нарочно няма да използваме функционалните интерфейси, които са налични в Java 8, а ще си дефинираме сами такъв: Прочети още...
* Затваряния (Closures)
Публикувано на 12 март 2015 в раздел ПИК3 Java.
Един интересен момент при писането на локални класове е свързан с достъпа до променливи и обекти, които са извън блока дефиниращ локалния клас. Оказва се, че локалните класове (и анонимните в частност) имат достъп до локални променливи и референции към обекти, които са извън техния обхват. Това важи също така и за новия по-модерен вариант с ламбда изрази в Java 8 (те са анонимни класове в крайна сметка). Има обаче едно сериозно ограничение - променливите или референциите трябва да са final. Нека дадем един първи елементарен пример: Прочети още...
* Вградени функционални интерфейси
Публикувано на 11 март 2015 в раздел ПИК3 Java.
В Java 8 има една поредица от вградени функционални интерфейси, които имат важна роля при използването на ламбда изрази в библиотечните функции. Използването на тези интерфейси е силно насърчително (вместо създаването на собствени еквивалентни такива). В предишната статия вече говорихме за добре познатите Comparator, ActionListener и Runnable. Сега ще обърнем внимание на някои от новите интерфейси, които идват с Java 8. Прочети още...
* Методи по подразбиране
Публикувано на 07 март 2015 в раздел ПИК3 Java.
Както вече знаем, ламбда изразите работят само и единствено с функционални интерфейси. Това е логично, защото ако един интерфейс има повече от един метод, компилатора няма как да знае кой от методите да използва при конвертирането на ламбда израза. Това е нормално и не подлежи на коментар. Интересен е обаче въпроса как да разширим съществуващи интерфейси, като им добавим допълнителни методи, които да могат да работят с ламбда изрази. Прочети още...
* Ламбда изрази
Публикувано на 06 март 2015 в раздел ПИК3 Java.
Ламбда изразите са функционалност, която е дълго чакана в Java. Появява се с версия Java 8 и е първата крачка към добавяне на... нека не казваме "елементи", а по-скоро "еквиваленти" на функционално програмиране в езика. При положение, че един от основните конкуренти на Java - .Net framework - ги поддържа още с версия 3.5 от 2007 г., може да се каже, че от Oracle (Sun) са доста закъснели. Разбира се това си има и причина - до известна степен ламбда изразите нарушават основната философия на абстрактния модел на интерфейсите в Java (за това няма да пишем сега, а в следваща статия по-подробно). Тук ще разгледаме общата философия на ламбда изразите и начина на работа с тях. Прочети още...
* Задача от контролно 1, вариант 2, 22 ноември 2014 г.
Публикувано на 22 ноември 2014 в раздел ПИК3 Java.
Задача 1. Създайте клас за филми (Movie) с член променливи име (name – тип String), времетраене в секунди (length - int) и трейлър (trailer - FileInputStream). Минималният брой на секундите в един филм трябва да e 3600. Създайте само един конструктор - с подадени параметри.
Задача 2. В клас Movie добавете следните методи: Прочети още...
* Задача от контролно 1, вариант 1, 22 ноември 2014 г.
Публикувано на 22 ноември 2014 в раздел ПИК3 Java.
Това е набързо написано (като за контролно :P) примерно решение на задачата от днешната контролна работа. Вероятно може много неща по него да се изгладят. Не е тествано въобще с реални данни - може да не е съвсем коректно. Моля ако някой има време, да го изпробва и да каже ако и къде има проблеми. Изтеглете сорс кода.
Задача 1. Създайте клас за фотоалбум (PhotoAlbum) с член променливи „брой страници“ (pagesCount – тип int) и списък от снимки (масив photos от тип FileInputStream). Максималният брой на снимките в един албум не трябва да превишава pagesCount*3 – това трябва да са границите на масива. Погрижете се новосъздаден фотоалбум да има минимум 10 страници. Освен конструктор с подадени параметри, трябва да създадете и конструктор по подразбиране, в който се създава нов празен албум с 16 страници. Прочети още...
* Игра на камъчета с трима играчи – сървър и клиент
Публикувано на 26 януари 2014 в раздел ПИК3 Java.
Трябва да се моделира комбинаторната игра камъчета (stones). Играта се играе от трима играчи и се състои в следното: Прочети още...
* Tic-tac-toe сървър и клиент
Публикувано на 26 януари 2014 в раздел ПИК3 Java.
Трябва да се създаде сървър за игра на “морски шах” (tic-tac-toe). Играта се играе от двама души върху дъска с девет квадратчета. Първият играч отбелязва знак „Х“ в квадратче по негов избор, след което втория отбелязва знак „О“ и така се редуват до изчерпване на квадратчетата. Целта е един от играчите да подреди три от неговите знаци по хоризонтала, вертикала или диагонал. Примерни изходи от играта са следните: Прочети още...
* Чат сървър и клиент с GUI
Публикувано на 17 декември 2013 в раздел ПИК3 Java.
В това упражнение беше показано как може да се изгради графичен интерфейс за чат клиент приложението от предишното упражнение. Използва се Swing, като се използват различни контроли - JLabel, JTextArea, JScrollPane, JTextField и JButton. Освен допълнителния клас (ClientGUI) има промени по другите два - в ClientThread всички System.out.println са променени така, че да обновяват графичните контроли, а в основния клас Client e премахната функционалността за четене на съобщение от клавиатурата чрез конзолата (тази дейност е прехвърлена към действието на бутона). Промени по сървъра няма и той продължава да си работи в конзолен режим. Демонстрирани са два често използвани Layouts - FlowLayout и BorderLayout - за разполагане на контролите. Не на последно място - използва се Event Dispatch Thread (EDT) чрез SwingUtilities.invokeLater(...), за да се прави синхронизирано обновяване на информацията по графичния интерфейс. Прочети още...