@kidar2

Как написать функцию join по любому строковому свойству?

Хочу написать функцию, которая бы делала join любого свойства в коллекции объектов.

Пример импользования примерно такой:
List<Field> arr = ...
StringUtil.join(arr, ",", x->x.Name)

Определить пытаюсь как-то так:
public static <T> String join(Collection<T> arr, String symbol, Predicate<T> bla )
	{
		
	}


Проблема в том, что я не понимаю как заюзать predicate чтобы он мне возаращал строку, или я может не то использую. Подскажите плз.
  • Вопрос задан
  • 190 просмотров
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Тут проблема в том, что Predicate - это функциональный интерфейс, используемый для проверки условий. Т.е., у него один метод test(), который проверяет условие. Решение есть, оно довольно простое.
1) Создаём свой функциональный интерфейс, который принимает объект и возвращает строку:
interface Getter<T> {
    String getString(T from);
}

Формально такой функциональный интерфейс соответствует лямбде, которая принимает один аргумент типа  T. А такая лямбда, в свою очередь, соответствует ссылке на метод класса Т без аргументов.

2) Создаём join (delimeter я опустил, добавьте его сами):
public static <T> String join(Collection<T> collection, Getter<T> getter) {
    StringBuilder builder = new StringBuilder();
    for(T cursor: collection) {
        builder.append(getter.getString(cursor));
    }
    return builder.toString();
}


3) Использовать так:
class User {
    ...
    public String getName() { ... }
}
List<User> users = ...;
String joined1 = join(users, User::getName); //<-- так
String joined2 = join(users, user -> user.getName()); //<-- или так
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
29 мар. 2024, в 10:00
10000 руб./за проект
29 мар. 2024, в 09:59
750 руб./в час
29 мар. 2024, в 09:55
50000 руб./за проект