Преобразование строки битов в массив перечислений с использованием потоков java 8 - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть строка разделенных пробелами битов (1 и 0), которые я хочу преобразовать в массив перечислений. Ниже приведены мои усилия.

Это класс Enum

enum Color { RED, GREEN }

Вот код преобразования.

Color[] colors = (Color[]) Arrays.stream(sc.nextLine().split("\\s"))
    .map(i -> {
         if (i.equals("0")) return Color.RED;
         else return Color.GREEN;
    })
    .toArray();

У меня возникают следующие проблемы с этим код:

  1. Он использует приведение типов для перехода от массива Object с к массиву Color с, что может привести к ошибкам во время выполнения. Мне бы очень понравилось, если бы не было приведения типов.

  2. Функция map. Я искал здесь в StackOverflow на mapToObj, чтобы увидеть, есть ли способ указать тип возврата карты. Я думаю, что безопаснее, когда вы указываете, что карта должна возвращать объект Color.

Ответы [ 2 ]

5 голосов
/ 08 апреля 2020

Чтобы избежать приведения, передайте параметр в toArray:

.toArray(Color[]::new)

Это единственное требуемое изменение.

Нет необходимости указывать тип возврата для функции карты , Тот факт, что вы возвращаете только экземпляры Color, означает, что его тип возврата равен Color.

3 голосов
/ 08 апреля 2020

Это способ go:

Color[] colors = Arrays.stream(sc.nextLine().split("\\s"))
    .map(i -> i.equals("0") ? Color.RED : Color.GREEN)
    .toArray(Color[]::new);

Если вы хотите преобразовать Stream в массив объектов, вам нужно использовать метод Stream::toArray(IntFunction).

...