Понимание Python-списка в Java


2 Answers

В Java 8 вы можете использовать ссылки на методы:

List<String> list = ...;
list.replaceAll(String::toUpperCase);

Или, если вы хотите создать новый экземпляр списка:

List<String> upper = list.stream().map(String::toUpperCase).collect(Collectors.toList());
Question

Поскольку Java не позволяет передавать методы в качестве параметров, какой трюк вы используете для реализации понимания Python как в Java?

У меня есть список (ArrayList) строк. Мне нужно преобразовать каждый элемент, используя функцию, чтобы получить другой список. У меня есть несколько функций, которые берут строку в качестве входных данных и возвращают другую строку в качестве вывода. Как создать общий метод, которому можно присвоить список и функцию как параметры, чтобы я мог получить список с обработанным элементом. Это невозможно в буквальном смысле, но какой трюк я должен использовать?

Другой вариант - написать новую функцию для каждой меньшей функции строковой обработки, которая просто перебирает весь список, что не так круто.







Вы можете использовать lambdas для функции, например:

class Comprehension<T> {
    /**
    *in: List int
    *func: Function to do to each entry
    */
    public List<T> comp(List<T> in, Function<T, T> func) {
        List<T> out = new ArrayList<T>();
        for(T o: in) {
            out.add(func.apply(o));
        }
        return out;
    }
}

Использование:

List<String> stuff = new ArrayList<String>();
stuff.add("a");
stuff.add("b");
stuff.add("c");
stuff.add("d");
stuff.add("cheese");
List<String> newStuff = new Comprehension<String>().comp(stuff, (a) -> { //The <String> tells the comprehension to return an ArrayList<String>
    a.equals("a")? "1": 
            (a.equals("b")? "2": 
                (a.equals("c")? "3":
                    (a.equals("d")? "4": a
    )))
});

вернется:

["1", "2", "3", "4", "cheese"]



Related