Узнайте, как использовать API Коллекции Eclipse в забавном ката Java-кода.

Ката время

На прошлой неделе в Oracle CodeOne я выступил со своим докладом на тему Инвестируйте в свой каталог Java. Ранее я выступал со-представителем на QCon New York. Видео выступления QCon NY доступно здесь. В своем выступлении я призываю разработчиков создавать свои собственные каты, чтобы научить себя новым навыкам программирования, а затем делиться этими катами с другими разработчиками. Я часто говорю, что лучше всего мы учимся на практике, и лучший способ учиться - учить.

Проще:

  1. Do
  2. Учат

Итак, вот я сейчас и практикую то, что проповедую. Остальная часть этого блога будет включать код для Хэллоуина Ката с использованием Java 8 с коллекциями Eclipse. Я только что разработал ката сегодня вечером. Возможно, нет лучшего способа увидеть, насколько хороши API Eclipse Collections, чем чашка или пакет конфет. Вы также можете увидеть, насколько хороши некоторые API-интерфейсы Java Time.

Начиная

Вы можете найти координаты Maven, чтобы получить двоичные файлы Eclipse Collections здесь, если вы хотите настроить простой проект Maven для работы. Чтобы упростить задачу, вы также можете просто загрузить Eclipse Collections Katas from GitHub, импортировать его в вашу любимую IDE в качестве проекта Maven и добавьте класс в тестовую папку под Pet Kata. Это именно то, что я сделал. Я назвал свой класс HalloweenKata. Я включил импорт, который использовал ниже, чтобы быть полезным.

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.ZoneId;
import java.util.Random;
import java.util.stream.IntStream;

import org.eclipse.collections.api.bag.Bag;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.api.set.MutableSet;
import org.eclipse.collections.api.tuple.primitive.ObjectIntPair;
import org.eclipse.collections.impl.collector.Collectors2;
import org.eclipse.collections.impl.factory.Lists;
import org.eclipse.collections.impl.factory.Sets;
import org.junit.Assert;
import org.junit.Test;
public class HalloweenKata
{
    ....
}

Кошелек или жизнь

Вот список Candy. Вы можете включить его как внутренний класс в HalloweenKata. Вы видите всех своих любимых на Хэллоуин? Я оставил свой любимый шоколадный батончик - Whatchamacallit? Слишком заманчиво.

enum Candy
{
    SNICKERS,
    MILKYWAY,
    REESES_PIECES,
    REESES_PEANUT_BUTTER_CUPS,
    M_AND_M_S,
    TWIZZLERS,
    WHOPPERS,
    ONE_HUNDRED_GRAND,
    SKITTLES,
    TWIX,
    CANDY_CORN,
    JOLLY_RANCHERS,
    NERDS,
    ALMOND_JOY,
    MOUNDS,
    BABY_RUTH,
    THREE_MUSKETEERS,
    HERSHEYS,
    CRUNCH,
    HERSHEYS_KISSES,
    MIKE_AND_IKE,
    MILK_DUDS,
    SWEDISH_FISH,
    YORK_PEPPERMINT_PATTY
}

Время отправить детей трюк или угощение

Обычно мы видим, как несколько групп детей приходят к нам домой в поисках конфет на Хэллоуин. Для простоты я сгруппировал их по трем образовательным группам в США.

private MutableList<Bag<Candy>> collectBagsOfCandy()
{
    LocalDate halloween =
            LocalDate.of(2018, Month.OCTOBER, 31);
    LocalTime elementarySchoolStart =
            LocalTime.NOON.plus(Duration.ofHours(3));
    LocalTime middleSchoolStart =
            elementarySchoolStart.plus(Duration.ofHours(2));
    LocalTime highSchoolStart =
            middleSchoolStart.plus(Duration.ofHours(2));
    long candyCount = 250L;

    Bag<Candy> elementarySchoolBag = this.trickOrTreat(
            halloween.atTime(elementarySchoolStart),
            candyCount);
    Bag<Candy> middleSchoolBag = this.trickOrTreat(
            halloween.atTime(middleSchoolStart),
            candyCount);
    Bag<Candy> highSchoolBag = this.trickOrTreat(
            halloween.atTime(highSchoolStart),
            candyCount);

    return Lists.mutable.with(
            elementarySchoolBag,
            middleSchoolBag,
            highSchoolBag);
}

Когда каждая группа совершает трюк или угощение, они получают случайную коллекцию конфет в свои сумки, посеянные по времени их начала.

public Bag<Candy> trickOrTreat(LocalDateTime time, long candyCount)
{
    ZoneId newYork = ZoneId.of("America/New_York");
    IntStream limit = new Random(
            time.atZone(newYork).toEpochSecond())
            .ints(0, Candy.values().length - 1)
            .limit(candyCount);
    Bag<Candy> bagOfCandy = limit.mapToObj(i -> Candy.values()[i])
            .collect(Collectors2.toBag());
    System.out.println(bagOfCandy.topOccurrences(10));
    return bagOfCandy;
}

Исправить тестовый стиль ката

В этом тесте отсутствует код. Ваша задача - заполнить недостающий код кодом, который будет скомпилирован и пройдет тест. Здесь вы можете попробовать и поэкспериментировать, изучая некоторые незнакомые или даже применяя знакомые API в коллекциях Eclipse.

@Test
public void topCandy()
{
    MutableList<Bag<Candy>> bagsOfCandy =
            this.collectBagsOfCandy();

    // Hint: Flatten the Bags of Candy into a single Bag
    Bag<Candy> bigBagOfCandy = null;

    // Hint: Find the top occurrence in the bag and convert that
    // to a set of Candy.
    MutableSet<Candy> mostCommon = null;
    Assert.assertEquals(
            Sets.mutable.with(Candy.CRUNCH),
            mostCommon);

    // Hint: Find the top 10 occurrences of Candy in each of the
    // bags and intersect them to see which are the common ones
    // between all of the bags.
    MutableSet<Candy> commonInTop10 = null;
    Assert.assertEquals(
            Sets.mutable.with(Candy.REESES_PIECES, Candy.CRUNCH),
            commonInTop10);
}

Примечание. Я пробовал запускать эти тесты на Mac Book Pro и Windows 10 с Java 8. Результаты совпадают между запусками, но я не проверял, согласуются ли они на любых других платформах и Java. версии.

Ката учить, Ката учить

Сегодня я быстро собрал это ката, чтобы показать, как вы можете исследовать различные API на языке программирования и библиотеке, создавая ката. Вы можете попробовать эти же ката на разных языках, с разными библиотеками коллекций или с помощью Java Streams. Вам действительно решать, чему вы хотите научиться и чему вы хотите научить других. Это ката сосредоточено на изучении и обучении нескольким API, доступным для типов коллекций Eclipse. Я создал простой вариант использования для демонстрации этих API, который, как я думал, может показаться многим разработчикам интересным и привлекательным.

Я разместил свои решения ката.

Счастливого Хэллоуина!

Коллекции Eclipse открыты для взносов. Если вам нравится библиотека, вы можете сообщить нам об этом, отметив ее на GitHub.