Статьи

Строки соединения в JDK 8

JDK 8 представил языковые функции, такие как лямбда-выражения , потоки и даже новый API даты / времени , которые изменят способ написания Java-приложений. Тем не менее, есть также несколько новых API и функций, которые могут быть менее «изменяющими игру», но все же привносят большее удобство и выразительность в язык программирования Java. В этой статье я рассмотрю одну из этих небольших функций и рассмотрю возможность простого объединения нескольких строк в JDK 8.

Возможно, самый простой способ объединить несколько строк в JDK 8 — это два новых статических метода в Java-классе String : join (CharSequence, CharSequence…) и join (CharSequence, Iterable) . В следующих двух листингах кода показано, как легко применить эти два метода String.join .

Использование String.join (CharSequence, CharSequence…)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
/**
 * Words associated with the blog at http://marxsoftware.blogspot.com/ in array.
 */
private final static String[] blogWords = {"Inspired", "by", "Actual", "Events"};
 
/**
 * Demonstrate joining multiple Strings using static String
 * "join" method that accepts a "delimiter" and a variable
 * number of Strings (or an array of Strings).
 */
private static void demonstrateStringJoiningArray()
{
   final String blogTitle = String.join(" ", blogWords);
   out.println("Blog Title: " + blogTitle);
 
   final String postTitle = String.join(" ", "Joining", "Strings", "in", "JDK", "8");
   out.println("Post Title: " + postTitle);
}

Использование String.join (CharSequence, Iterable)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 * Pieces of a Media Access Control (MAC) address.
 */
private final static List<String> macPieces;
 
static
{
   macPieces = new ArrayList<>();
   macPieces.add("01");
   macPieces.add("23");
   macPieces.add("45");
   macPieces.add("67");
   macPieces.add("89");
   macPieces.add("ab");
};
 
/**
 * Demonstrate joining multiple Strings using static String
 * "join" method that accepts a "delimiter" and an Iterable
 * on Strings.
 */
private static void demonstrateStringJoiningIterable()
{
   final String macAddress = String.join(":", macPieces);
   out.println("MAC Address: " + macAddress);
}

Результат выполнения двух приведенных выше списков кода:

1
2
3
Blog Title: Inspired by Actual Events
Post Title: Joining Strings in JDK 8
MAC Address: 01:23:45:67:89:ab

Использование двух статических методов String.join — это простой способ объединения строк, но класс StringJoiner, представленный в JDK 8, обеспечивает еще большую мощность и гибкость. Следующий листинг кода демонстрирует создание экземпляра StringJoiner и передачу ему указанного разделителя (десятичная точка), префикса (открывающая скобка) и суффикса (закрывающая скобка).

Simple String Joiner Use

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
/**
 * Demonstrate joining multiple Strings using StringJoiner
 * with specified prefix, suffix, and delimiter.
 */
private static void demonstrateBasicStringJoiner()
{
   // StringJoiner instance with decimal point for delimiter, opening
   // parenthesis for prefix, and closing parenthesis for suffix.
   final StringJoiner joiner = new StringJoiner(".", "(", ")");
   joiner.add("216");
   joiner.add("58");
   joiner.add("216");
   joiner.add("206");
   final String ipAddress = joiner.toString();
   out.println("IP Address: " + ipAddress);
}

При выполнении вышеуказанного кода в стандартный вывод выводится следующая строка: «IP-адрес: (216.58.216.206)»

StringJoiner — это особенно привлекательный подход в сценарии, когда добавляется разделительный символ в строку, создаваемую как часть некоторого типа итерации с помощью StringBuilder . В таких случаях часто приходилось удалять дополнительный символ, добавленный в конец этого компоновщика с последней итерации. StringJoiner «достаточно умен», чтобы добавлять разделители только между конкатенируемыми строками, а не после последнего. Последовательные вызовы методов add(CharSequence) очень похожи на API StringBuilder / StringBuffer .

Последний из представленных в JDK 8 подходов для объединения строк, о которых я расскажу в этом посте, — это использование потоковых коллекций с объединяющим коллектором ( операция сокращения ). Это продемонстрировано в следующем листинге кода, и его выходные данные аналогичны подходу String.join используемому для печати MAC-адреса через String.join который принял Iterable качестве второго аргумента.

Строка, соединяющаяся с потоком коллекции

01
02
03
04
05
06
07
08
09
10
11
/**
 * Demonstrate joining Strings in a collection via that collection's
 * Stream and use of the Joining Collector.
 */
private static void demonstrateStringJoiningWithCollectionStream()
{
   final String macAddress =
      macPieces.stream().map(
         piece -> piece.toString()).collect(Collectors.joining(":"));
   out.println("MAC Address: " + macAddress);
}

Если разработчик хочет предоставить префикс и суффикс для присоединяемой строки без необходимости последовательных вызовов для add методов, необходимых для объединения String с StringJoiner , метод Collectors.joining (CharSequence, CharSequence, CharSequence) идеально подходит. В следующем примере кода показан приведенный выше пример IP-адреса, который использовался для демонстрации StringJoiner , но на этот раз реализован с коллекцией, потоком и соединительным коллектором. Вывод такой же, как и в предыдущем примере, без необходимости указывать add(CharSequence) для каждой String нужно объединить.

Соединение строк с потоком и префиксом и суффиксом коллекции

01
02
03
04
05
06
07
08
09
10
11
12
13
/**
 * Demonstrate joining Strings in a collection via that collection's
 * Stream and use of a Joining Collector that with specified prefix
 * and suffix.
 */
private static void demonstrateStringJoiningWithPrefixSuffixCollectionStream()
{
   final List<String> stringsToJoin = Arrays.asList("216", "58", "216", "206");
   final String ipAddress =
      stringsToJoin.stream().map(
         piece -> piece.toString()).collect(Collectors.joining(".", "(", ")"));
   out.println("IP Address: " + ipAddress);
}

В этом блоге описаны три подхода к соединению строк, доступных в JDK 8:

  1. Статические методы String.join
  2. Экземпляр StringJoiner
  3. Коллекционный поток с присоединяющимся коллектором
Ссылка: Присоединяйтесь к Strings в JDK 8 от нашего партнера JCG Дастина Маркса в блоге Inspired by Actual Events .