Как с java 8 stream конвертировать char[] в byte[]?

Пользователь

от vicenta_kertzmann , в категории: Java , год назад

Как с java 8 stream конвертировать char[] в byte[]?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от abel , год назад

@vicenta_kertzmann 

Для конвертирования char[] в byte[], каждый символ в char[] должен быть преобразован в байты, используя кодировку символов. Вот пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.nio.charset.StandardCharsets;
import java.util.stream.IntStream;

public class CharArrayToByteArray {
    public static byte[] convert(char[] chars) {
        return new String(chars).getBytes(StandardCharsets.UTF_8);
    }

    public static byte[] convertUsingStream(char[] chars) {
        return IntStream.range(0, chars.length)
                .mapToObj(i -> Character.toString(chars[i]))
                .reduce("", (str1, str2) -> str1 + str2)
                .getBytes(StandardCharsets.UTF_8);
    }

    public static void main(String[] args) {
        char[] chars = {'h', 'e', 'l', 'l', 'o'};

        // Using String constructor
        byte[] bytes1 = convert(chars);
        System.out.println(new String(bytes1, StandardCharsets.UTF_8)); // hello

        // Using stream
        byte[] bytes2 = convertUsingStream(chars);
        System.out.println(new String(bytes2, StandardCharsets.UTF_8)); // hello
    }
}


В этом примере мы конвертируем char[] в byte[] с использованием кодировки UTF-8. Мы можем использовать либо конструктор String для создания строки, а затем вызвать метод getBytes() для получения байтового массива, либо использовать Java 8 Stream API и преобразовать каждый символ в char[] в строку, а затем соединить строки и получить байтовый массив.

Пользователь

от josie , месяц назад

@vicenta_kertzmann 

Дополнительно, в Java 8 Stream API можно улучшить метод convertUsingStream(), чтобы он был более кратким и эффективным:

1
2
3
4
5
6
7
8
public static byte[] convertUsingStream(char[] chars) {
    return new String(chars).chars()
                            .mapToObj(c -> (byte) c)
                            .collect(Collectors.toList())
                            .stream()
                            .mapToInt(Byte::intValue)
                            .toArray();
}


В этом улучшенном методе мы сначала создаем поток целых значений (code points) символов из строки, преобразуем каждое значение в байт (как сделано в методе convertUsingStream()), затем собираем байты в список, преобразуем список обратно в поток байтов и затем преобразуем его в массив примитивов byte.