• ,

Популярно о лямбдах в java. С примерами и задачами.

Для кого предназначена эта статья?
  • для тех, кто считает, что уже неплохо знает Java Core, но понятия не имеет о лямбдах в джаве. Ну может слышал там что-то про лямбды, но хз что это за ужасы такие.
  • для тех, кто имеет какое-то понимание о лямбдах, но до сих пор боится их использовать.

8 уровень. 8 лекция. Зинаида Васильевна — классный руководитель 7-Б класса//

Добрый день!
классный руководитель 7-Б класса какой-то там террианской школы, подробности не важны. А важно то, что она дарит подарки ученикам в дни рождения. Везет не всем: летние именинники — в пролёте по причине каникул. Пишем программу для Зинаиды: создаем словарь с фамилиями и датами рождения, удаляем из него людей, родившихся летом.

package com.javarush.task.task08.task0816;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;


/*
Добрая Зинаида и летние каникулы
*/

public class Solution {
    public static HashMap<String, Calendar> createMap() {
        HashMap<String, Calendar> map = new HashMap<String, Calendar>();
        map.put("Stallone1", new GregorianCalendar(1975, Calendar.DECEMBER, 31));
        map.put("Stallone2", new GregorianCalendar(1975, Calendar.DECEMBER, 31));
        map.put("Stallone3", new GregorianCalendar(1975, Calendar.DECEMBER, 31));
        map.put("Stallone4", new GregorianCalendar(1975, Calendar.DECEMBER, 31));
        map.put("Stallone5", new GregorianCalendar(1975, Calendar.JULY, 31));
        map.put("Stallone6", new GregorianCalendar(1975, Calendar.DECEMBER, 31));
        map.put("Stallone7", new GregorianCalendar(1975, Calendar.DECEMBER, 31));
        map.put("Stallone8", new GregorianCalendar(1975, Calendar.JUNE, 31));
        map.put("Stallone9", new GregorianCalendar(1975, Calendar.DECEMBER, 31));
        map.put("Stallone10", new GregorianCalendar(1975, Calendar.DECEMBER, 31));
        return map;
        //напишите тут ваш код
    }

    public static void removeAllSummerPeople( HashMap<String,Calendar>  map) {
        for (HashMap.Entry<String, Calendar> entry : map.entrySet()) {
            if (entry.getValue().MONTH > 5 && entry.getValue().MONTH < 9)
                map.remove(entry.getKey());
        }

        //напишите тут ваш код

    }

    public static void main(String[] args) {

        HashMap<String, Calendar> map = createMap();
        removeAllSummerPeople (map);
        for (HashMap.Entry<String, Calendar> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
        System.out.println();


    }
}


В результате выполнения данного кода выводит следующее:
Stallone8 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone9 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone10 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone6 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone7 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone4 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone5 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=6,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone2 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone3 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Stallone1 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=«Europe/Moscow»,offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=1975,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=31,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

Process finished with exit code 0


Подскажите пожалуйста как вывести значение из Calendar в виде «1971 JUNE 31»
  • ,

level24.lesson14.big01 задание 8 - не компилируется на сервере, хотя в Идее компилируется

(UPD.: Проблема была в том, что у меня была JDK 8, а сервер проверяет в JDK 7. Поставив, по совету техподдержки, JDK 7 и переставив на него Project JavaRushHomeWork в Intelij Idea => Project Structure, я сразу же увидел, что нужно изменить.)

У меня в Идее все компилируется, лишних импортов нет. Правда, сначала я по-глупости отправил код, который действительно не компилировался, но потом исправил ошибки — и все равно не компилируется на сервере. Это лаги такие или можно как-то исправить?

Условие задания и код. (По сравнению с принятым заданием 7 изменялись только первые приводимые мной 4 класса — BaseObject и наследники, новых классов не добавилось. Кроме приведенных здесь классов, больше классов в пакете нет.)

Условие:
Задание 8
Но и это еще не все.
Классу BaseObject нужны еще методы.
Пока это будут пустые методы draw() и move().
Классы-наследники должны будут переопределить их у себя и реализовать необходимую функциональность.
Объяви эти методы, но сделай их абстрактными.
Также сделай абстрактным сам класс BaseObject.

А еще нам нужно будет определять попал шарик в кирпич или в подставку.
Это будем делать так:
В этом же классе, создадим специальный метод: public boolean isIntersec(BaseObject o)
Он будет определять — «пересеклись» объекты или нет. Если пересеклись — возвращать true, если нет — false.

Т.к. объекты мы условно считаем кругами, то предлагаю такую формулу взаимодействия
Если центр круга одного объекта попал в круг другого, то будем считать, что они столкнулись.
Или еще проще:
дистанция_между_объектами < max (радиус_первого_объекта, радиус_второго_объекта)

BaseObject.java:
package com.javarush.test.level24.lesson14.big01;

public abstract class BaseObject {
    double x;
    double y;
    double radius;

    public BaseObject(double x, double y, double radius) {
        this.radius = radius;
        this.x = x;
        this.y = y;
    }

    public abstract void draw();
    public abstract void move();
    public boolean isIntersec(BaseObject o){
        return Math.sqrt((this.x - o.getX())*(this.x - o.getX()) + (this.y - o.getY())*(this.y - o.getY()))
< Double.max(this.radius, o.getRadius());
    }

    public double getRadius() {
        return radius;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public void setX(double x) {
        this.x = x;
    }

    public void setY(double y) {
        this.y = y;
    }
}


Stand.java:
package com.javarush.test.level24.lesson14.big01;

public class Stand extends BaseObject {
    public Stand(double x, double y, double radius) {
        super(x, y, radius);
    }

    @Override
    public void draw() {
    }

    @Override
    public void move() {
    }
}


Ball.java:
package com.javarush.test.level24.lesson14.big01;

public class Ball extends BaseObject {
    public Ball(double x, double y, double radius) {
        super(x, y, radius);
    }

    @Override
    public void draw() {
    }

    @Override
    public void move() {
    }
}


Brick.java:
package com.javarush.test.level24.lesson14.big01;

public class Brick extends BaseObject {
    public Brick(double x, double y, double radius) {
        super(x, y, radius);
    }

    @Override
    public void draw() {
    }

    @Override
    public void move() {
    }
}


Canvas.java:
package com.javarush.test.level24.lesson14.big01;

public class Canvas {
}


Arcanoid.java:
package com.javarush.test.level24.lesson14.big01;

import java.util.ArrayList;

public class Arcanoid {
    public static Arcanoid game;

    int width;
    int height;
    Ball ball;
    Stand stand;
    ArrayList<Brick> bricks;

    public static void main(String[] args){

    }

    public void run(){

    }

    public void move(){

    }

    public Arcanoid(int height, int width) {
        this.height = height;
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public int getWidth() {
        return width;
    }

    public Ball getBall() {
        return ball;
    }

    public ArrayList<Brick> getBricks() {
        return bricks;
    }

    public Stand getStand() {
        return stand;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public void setBall(Ball ball) {
        this.ball = ball;
    }

    public void setBricks(ArrayList<Brick> bricks) {
        this.bricks = bricks;
    }

    public void setStand(Stand stand) {
        this.stand = stand;
    }
}


Результат выполнения Arcanoid.main:
Process finished with exit code 0
  • ,

По следам big 21-25

Всем добрый вечер,

Решая большие задачки уровней 21-25, возникла мысль, что обязательно нужно после решения написать аналоги такие же, только самостоятельно, что я и сделал. После этого возникла следующая мысль — почему бы не сделать это не в консоли, а в «графике»? На праздниках занялся, прошелся по основам swing по Хорстманну, написал небольшой проектик (игры Hippodrom, Tetris, Arcanoid, Snake, Space Wars), используя swing.

Кроме арканоида, придерживался такой логики построения приложения: ужасная, кривая, неправильная до ужаса адаптация mvc — то есть есть сущности, есть логика приложения, есть вьюшка и обработчик событий. Отдаю себе отчет, что код у меня там корявый, просто хотел понять, что такое есть swing, и с чем его едят. Да и времени на это счастье дал себе только до конца праздников, а там, сами понимаете, времени не очень много :)

В общем, jarnik выкладываю, если кто-нибудь решится запустить, особо не ругайте :))

ps для работы, скорее всего, нужна будет java 8, не ниже
  • ,

Запуск апплета Java в браузере

Доброго дня, джаварашевцы!

Сегодня решил заиметь хотя бы малейшее представление о том, что такое библиотека awt и столкнулся с проблемой при запуске первого простейшего апплета.
Через appletviewer он запустился, а вот в браузере ни в какую.
Сначала проблема была из-за установленной старой версии JRE вместе с последней. Удалил ее, установил Java 8 Update 31 и для 32, и для 64-битных версий ОС. На сайте Oracle проверка прошла удачно, и там тестовый апплет запустился. Но когда я пытаюсь запустить свой локальный апплет, в итоге он отображается примерно так:


Щелкая по нему, получаю такое окно:



Добавить в список исключений в контрольной панели Java локальный апплет я не могу.
В чем может быть проблема? Может не париться и спокойно запускать апплеты через appletviewer? Либо откатиться до 7 версии JRE и снизить настройки безопасности?
Просто и так два часа ковыряюсь с JRE, хочется уже код писать, наконец.

LocalDate в java.sql.Date и обратно

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.sql.Date;
import java.time.LocalDate;

@Converter(autoApply = true)
public class LocalDatePersistenceConverter implements
        AttributeConverter<LocalDate, Date> {
    @Override
    public java.sql.Date convertToDatabaseColumn(LocalDate entityValue) {
        return java.sql.Date.valueOf(entityValue);
    }

    @Override
    public LocalDate convertToEntityAttribute(java.sql.Date databaseValue) {

        return (databaseValue == null) ? null
                                    : databaseValue.toLocalDate();
    }
}


Пример сущности:
@Entity
public class Client{
    @Id 
    private long id;
    private LocalDate birthday;

    //тут должны быть геттеры и сеттеры
}
  • ,

com.javarush.test.level30.lesson02.home01

Тестировал на огромном количестве разных чисел, работает должным образом. Только в моем решении максимально допустимое число ограничено Long.MAX_VALUE(по моему этого достаточно). Подскажите в чем проблема?

package com.javarush.test.level30.lesson02.home01;

import java.util.ArrayList;
import java.util.List;

/* Конвертер систем счислений
Реализуйте логику метода convertNumberToOtherNumerationSystem, который должен переводить число number.getDigit()
из одной системы счисления(numerationSystem) в другую (expectedNumerationSystem)
бросьте NumberFormatException, если переданное число некорректно, например, число "120" с системой счисления 2
Валидация для - number.getDigit() - целое не отрицательное
Метод main не участвует в тестировании
*/
public class Solution {
    public static ArrayList<Character> validChar = new ArrayList<Character>();
    static {
        validChar.add('0');
        validChar.add('1');
        validChar.add('2');
        validChar.add('3');
        validChar.add('4');
        validChar.add('5');
        validChar.add('6');
        validChar.add('7');
        validChar.add('8');
        validChar.add('9');
        validChar.add('a');
        validChar.add('b');
        validChar.add('c');
        validChar.add('d');
        validChar.add('e');
        validChar.add('f');
    }

    public static void main(String[] args) {
        Number number = new Number(NumerationSystemType._16, "DeedBeef");
        Number result = convertNumberToOtherNumerationSystem(number, NumerationSystemType._10);
        System.out.println(result);
    }

    public static Number convertNumberToOtherNumerationSystem(Number number, NumerationSystem expectedNumerationSystem) {

        String numberInStringRepresentation = number.getDigit();
        int radix = number.getNumerationSystem().getNumerationSystemIntValue();

        if (!isValid(numberInStringRepresentation, radix))
            throw new NumberFormatException();

        long longRepresentation = Long.parseLong(numberInStringRepresentation, radix);
        System.out.println(longRepresentation);

        int expectedRadix = expectedNumerationSystem.getNumerationSystemIntValue();
        String expectedValue = Long.toString(longRepresentation, expectedRadix);

        return new Number(expectedNumerationSystem, expectedValue);
    }

    public static boolean isValid(String number, int radix) {
        List<Character> currValidChar = validChar.subList(0, radix);

        for (char ch : number.toLowerCase().toCharArray()) {
            if (!currValidChar.contains(ch)) {
                return false;
            }
        }

        return true;
    }
}
  • ,

Особенности Java 8 – максимальное руководство (часть 2)

Вторая часть перевода статьи Java 8 Features – The ULTIMATE Guide. Первая часть тут (ссылка может поменяться).

  • ,

Особенности Java 8 – максимальное руководство (часть 1)

Первая часть перевода статьи Java 8 Features – The ULTIMATE Guide. Вторая часть тут (ссылка может поменяться).

От редакции: статья опубликована в то время как Java 8 была доступна общественности и все указывает на то, что это действительно major-версия.
Здесь мы в изобилии предоставили руководства Java Code Geeks, такие как Играем с Java 8 – Лямбды и Параллелизм, Java 8 руководство по API даты и времени: LocalDateTime и Абстрактный Класс против Интерфейса в эру Java 8.

Мы также ссылаемся на 15 необходимых к прочтению руководств по Java 8 из других источников. Конечно мы рассматриваем некоторые из недостатков, например, Темная сторона Java 8.

Итак, пришло время собрать все основные особенности Java 8 в одном месте для вашего удобства. Наслаждайтесь!

  • ,

Никаких оправданий при использовании нулевых указателей в Java 8.



Тони Хоар ввел понятие нулего указателя в язык ALGOL W еще
в 1965 году: «Просто это было легко реализовать».
Через много лет Тони Хоар выразил сожаление в своей речи,
названной «моя ошибка на миллиард долларов».