Гуава 18: что нового?

Гуава 18: что нового?

1. обзор

Google Guava предоставляет библиотеки с утилитами, упрощающими разработку на Java. В этом руководстве мы рассмотрим новые функции, представленные вGuava 18 release.

2. MoreObjects Класс полезности

В Guava 18 был добавлен классMoreObjects, который содержит методы, не имеющие эквивалентов вjava.util.Objects.

Начиная с версии 18, он содержит только реализации методаtoStringHelper, который может быть использован для создания ваших собственных методовtoString.

  • toStringHelper (Класс clazz)

  • toStringHelper (сам объект)

  • toStringHelper (String имя класса)

ОбычноtoString() используется, когда вам нужно вывести некоторую информацию об объекте.. Обычно он должен содержать подробности о текущем состоянии объекта. Используя одну из реализацийtoStringHelper, вы можете легко создать полезное сообщениеtoString().

Предположим, у нас есть объектUser, содержащий несколько полей, которые необходимо записать при вызовеtoString(). Мы можем использовать методMoreObjects.toStringHelper(Object self), чтобы сделать это легко.

public class User {

    private long id;
    private String name;

    public User(long id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
            .add("id", id)
            .add("name", name)
            .toString();
    }
}

Здесь мы использовали методtoStringHelper(Object self). С помощью этой настройки мы можем создать образец пользователя, чтобы увидеть результат при вызовеtoString().

User user = new User(12L, "John Doe");
String userState = user.toString();
// userState: User{ id=12,name=John Doe }

Две другие реализации вернут тот жеString, если настроены аналогичным образом:

toStringHelper (Класс clazz)

@Override
public String toString() {
    return MoreObjects.toStringHelper(User.class)
        .add("id", id)
        .add("name", name)
        .toString();
}

toStringHelper (String имя класса)

@Override
public String toString() {
    return MoreObjects.toStringHelper("User")
        .add("id", id)
        .add("name", name)
        .toString();
}

Разница между этими методами очевидна, если вы вызываетеtoString() в расширениях классаUser. Например, если у вас есть два видаUsers:Administrator иPlayer, они будут давать разные результаты. __

public class Player extends User {
    public Player(long id, String name) {
        super(id, name);
    }
}

public class Administrator extends User {
    public Administrator(long id, String name) {
        super(id, name);
    }
}

Если вы используетеtoStringHelper(Object self) в классеUser, тогда вашPlayer.toString() вернет «Player\{id=12, name=John Doe}». Однако, если вы используетеtoStringHelper(String className) илиtoStringHelper(Class<?> clazz),Player.toString() вернет «User\{id=12, name=John Doe}». Указанное имя класса будет родительским, а не подклассом.

3. Новые методы вFluentIterable

3.1. обзор

FluentIterable используется для работы с экземплярамиIterable в цепочке. Посмотрим, как это можно использовать.

Предположим, у вас есть список объектовUser, определенных в приведенных выше примерах, и вы хотите отфильтровать этот список, чтобы включить в него только пользователей в возрасте 18 лет и старше.

List users = new ArrayList<>();
users.add(new User(1L, "John", 45));
users.add(new User(2L, "Michelle", 27));
users.add(new User(3L, "Max", 16));
users.add(new User(4L, "Sue", 10));
users.add(new User(5L, "Bill", 65));

Predicate byAge = user -> user.getAge() >= 18;

List results = FluentIterable.from(users)
                           .filter(byAge)
                           .transform(Functions.toStringFunction())
                           .toList();

Полученный список будет содержать информацию для Джона, Мишель и Билла.

3.2. FluentIterable.of(E[])с

С этим методом. вы можете создатьFluentIterable из массиваObject.

User[] usersArray = { new User(1L, "John", 45), new User(2L, "Max", 15) } ;
FluentIterable users = FluentIterable.of(usersArray);

Теперь вы можете использовать методы, предоставленные в интерфейсеFluentIterable.

3.3. FluentIterable.append(E…)с

Вы можете создать новыйFluentIterable из существующегоFluentIterable, добавив к нему больше элементов.

User[] usersArray = {new User(1L, "John", 45), new User(2L, "Max", 15)};

FluentIterable users = FluentIterable.of(usersArray).append(
                                 new User(3L, "Sue", 23),
                                 new User(4L, "Bill", 17)
                             );

Как и ожидалось, размер результирующегоFluentIterable равен 4.

3.4. FluentIterable.append(Iterable<? extends E>)>

Этот метод ведет себя так же, как и в предыдущем примере, но позволяет вам добавить все содержимое любой существующей реализацииIterable вFluentIterable.

User[] usersArray = { new User(1L, "John", 45), new User(2L, "Max", 15) };

List usersList = new ArrayList<>();
usersList.add(new User(3L, "Diana", 32));

FluentIterable users = FluentIterable.of(usersArray).append(usersList);

Как и ожидалось, размер результирующегоFluentIterable равен 3.

3.5. FluentIterable.join(Joiner)с

МетодFluentIterable.join(…) создаетString, представляющее все содержимоеFluentIterable, к которому присоединяется данныйString.

User[] usersArray = { new User(1L, "John", 45), new User(2L, "Max", 15) };
FluentIterable users = FluentIterable.of(usersArray);
String usersString = users.join(Joiner.on("; "));

ПеременнаяusersString будет содержать результат вызова методаtoString() для каждого элементаFluentIterable, разделенный знаком «;». КлассJoiner предоставляет несколько вариантов соединения строк.

4. Hashing.crc32cс

Хеш-функция - это любая функция, которую можно использовать для сопоставления данных произвольного размера с данными фиксированного размера. Он используется во многих областях, таких как криптография и проверка ошибок в передаваемых данных.

МетодHashing.crc32c возвращаетHashFunction, реализующийCRC32C algorithm.

int receivedData = 123;
HashCode hashCode = Hashing.crc32c().hashInt(receivedData);
// hashCode: 495be649

5. InetAddresses.decrement(InetAddress)с

Этот метод возвращает новыйInetAddress, который будет «на единицу меньше», чем его ввод.

InetAddress address = InetAddress.getByName("127.0.0.5");
InetAddress decrementedAddress = InetAddresses.decrement(address);
// decrementedAddress: 127.0.0.4

6. Новые исполнители вMoreExecutors __

6.1. Обзор потоков

В Java вы можете использовать несколько потоков для выполнения работы. Для этого в Java есть классыThread иRunnable.

ConcurrentHashMap threadExecutions = new ConcurrentHashMap<>();
Runnable logThreadRun = () -> threadExecutions.put(Thread.currentThread().getName(), true);

Thread t = new Thread(logThreadRun);
t.run();

Boolean isThreadExecuted = threadExecutions.get("main");

Как и ожидалось,isThreadExecuted будетtrue. Также вы можете видеть, что этотRunnable будет работать только в потокеmain. Если вы хотите использовать несколько потоков, вы можете использовать разныеExecutorsдля разных целей.

ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(logThreadRun);
executorService.submit(logThreadRun);
executorService.shutdown();

Boolean isThread1Executed = threadExecutions.get("pool-1-thread-1");
Boolean isThread2Executed = threadExecutions.get("pool-1-thread-2");
// isThread1Executed: true
// isThread2Executed: true

В этом примере вся представленная работа выполняется в потокахThreadPool.

Guava предоставляет различные методы в своем классеMoreExecutors.

6.2. MoreExecutors.directExecutor()с

Это легкий исполнитель, который может запускать задачи в потоке, вызывающем методexecute.

Executor executor = MoreExecutors.directExecutor();
executor.execute(logThreadRun);

Boolean isThreadExecuted = threadExecutions.get("main");
// isThreadExecuted: true

6.3. MoreExecutors.newDirectExecutorService()с

Этот метод возвращает экземплярListeningExecutorService. Это более тяжелая реализацияExecutor, имеющая много полезных методов. Он похож на устаревший методsameThreadExecutor() из предыдущих версий Guava.

ЭтотExecutorService будет запускать задачи в потоке, который вызывает методexecute().

ListeningExecutorService executor = MoreExecutors.newDirectExecutorService();
executor.execute(logThreadRun);

У этого исполнителя есть много полезных методов, таких какinvokeAll, invokeAny, awaitTermination, submit, isShutdown, isTerminated, shutdown, shutdownNow.

7. Заключение

Guava 18 внес несколько дополнений и улучшений в свою растущую библиотеку полезных функций. Это стоит рассмотреть для использования в вашем следующем проекте. Примеры кода в этой статье доступныin the GitHub repository.