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