Как преобразовать каждый цикл в лямбду для каждого?

У меня есть код ниже, где я беру массив строк и конвертирую их в массив символов. Как я могу преобразовать его, чтобы использовать лямбда-функцию?

У меня есть функция (countOcc), для которой требуется массив символов (char[][]), но я хотел сделать возможным ее использование с массивом строк (String[]), используя метод toArray строки.

public final int countOcc (String[] value) {
    int m = 1;
    for (String v : value) if (v.length() >= m) m = v.length();
    char[][] a = new char[value.length][m];
    for (int i = 0; i < value.length; i++) a[i] = value[i].toCharArray();
    return countOcc(a);
 }

я пробовал использовать Arrays.stream().foreach(), как показано ниже, но когда я делаю что-то вроде C++, это выдает ошибку

public final int countOcc (String[] value) {
    int m = 1;
    Arrays.stream(value).forEach(e -> {
        if (e.length() >= m) m = e.length();
    });
    char[][] a = new char[value.length][m];
    int c = 0;
    Arrays.stream(value).forEach(e -> {
        a[c] = e.toCharArray();
        c++;
    });
    return countOcc(a);
}

Какова цель кода, который вы пишете?

g00se 10.08.2024 22:20

у меня есть функция (countOcc), для которой требуется массив символов (char[][]), но я хотел сделать возможным ее использование с массивом строк (String[]), используя метод toArray строки @g00se

matita08 10.08.2024 22:25

Я подозреваю, что вам нужен подсчет частоты символов, поэтому: Map<String, Long> counts = Arrays.stream(args).flatMapToInt(String::codePoints).mapToOb‌​j(Character::toStrin‌​g).collect(Collector‌​s.groupingBy(Functio‌​n.identity(), Collectors.counting()));System.out.println(counts);

g00se 10.08.2024 23:04

Особо обратите внимание, что границы char долгое время были неадекватными, и в настоящее время все должно быть ориентировано на кодовые точки (int). Итак, «символы» в конечном итоге превращаются в String, как и должно быть, в клавишах Map в моем примере.

g00se 10.08.2024 23:17

Добро пожаловать в Stack Overflow. Ваша ошибка говорит вам, что внутри вашей лямбды вам не разрешено изменять переменную, существующую вне лямбды (вероятно, там говорится, что переменная должна быть «фактически окончательной»). Вы можете помочь нам быть уверенными, вставив сообщение об ошибке в свой вопрос. Итак, c++ не идет. Кроме того, при последующем предоставлении внутренних массивов их выделение с самого начала является просто пустой тратой. Итак, в вашем рабочем коде удалите первый цикл for-each и выделите массив, просто char[][] a = new char[value.length][]; оставив m.

Anonymous 11.08.2024 07:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы пытаетесь преобразовать String[] в char[][], сделайте что-то вроде:

String[] value = {"foo", "bar", "fizz"};
char[][] a = Arrays.stream(value).map(s -> s.toCharArray()).toArray(char[][]::new);

затем вызовите другой метод

return countOcc(a);

спасибо, а у вас есть руководство по потокам?

matita08 10.08.2024 22:36

Всегда лучше читать официальную документацию. Но в качестве введения вы можете прочитать эту статью от oracle . Baeldung также является хорошим веб-сайтом с простыми объяснениями и примерами. Вот введение и несколько продолжений

Asmir 10.08.2024 22:46

Кстати, s -> s.toCharArray() можно заменить на String::toCharArray (по крайней мере, чтобы соответствовать char[][]::new)

user85421 11.08.2024 10:06

Я подозреваю, что вам нужен подсчет частоты символов, поэтому вы можете использовать потоковую передачу и Collectors для достижения этой цели.

Особо обратите внимание, что границы char долгое время были неадекватными, и в настоящее время все должно быть ориентировано на кодовые точки (int). Итак, «символы» в конечном итоге превращаются в String, как и должно быть, в клавишах Map в примере ниже.

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class CharacterFrequencyCounter {
    public static void main(String[] args) throws Exception {
        String flag = new String(new int[] { 0x1F1EC, 0x1F1E7 }, 0, 2);
        String[] text = new String[] {
                "This is the flag of Great Britain",
                flag };
        System.out.println(Arrays.toString(text));
        System.out.println(CharacterFrequencyCounter.getCounts(text));

    }

    public static Map<String, Long> getCounts(String... strings) {
        return Arrays.stream(strings).flatMapToInt(String::codePoints).mapToObj(Character::toString)
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    }
}

Другие вопросы по теме