Вызов метода в Java 8 - PullRequest
       5

Вызов метода в Java 8

0 голосов
/ 13 ноября 2018

У меня есть метод,

private String createSubjectColumnForOutgoing(Message message)
{
    //TODO : Changes for blocking messages of spam users


    if(message.getReceiverEnvelope() != null && message.getReceiverEnvelope().getUser() != null && message.getReceiverEnvelope().getUser().isBlocked())
    {
        return I18N.IN_REVIEW_BY_TEAM.msg();
    }


    return StringUtils.deSanitizeSpecialCharacters(message.getSubject());
}

, и этот метод вызывается так:

case OUTGOING:
            table.addGeneratedColumn(I18N.MESSAGETABLE_HEADER_SUBJECT.msg(), this::createSubjectColumnForOutgoing);
            break;

И конструктор в классе:

public MessageTable(Directory directory, boolean withFilter, Device device)
{
    this(directory, new FilterConfiguration(withFilter), device);
}

public MessageTable(Directory directory, FilterConfiguration filterConfiguration, Device device)
{
    Objects.requireNonNull(directory);
    Objects.requireNonNull(device);

    this.directory = directory;

    dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(LocaleAware.super.getLocale());

    tableFooter = createTableFooter();

    openButton = createOpenButton();
    newButton = createNewButton();
    messageTable = createTable(device);

    tableFooter.addComponent(newButton, 0);
    tableFooter.addComponent(openButton, 1);

    final VerticalLayout layout = new VerticalLayout();
    layout.addComponent(createFilterComponent(filterConfiguration));
    layout.addComponents(tableFooter, messageTable);
    layout.setComponentAlignment(tableFooter, Alignment.MIDDLE_LEFT);

    rootLayout = layout;
    setCompositionRoot(rootLayout);

}

При вызове этого метода createSubjectColumnForOutgoing параметр не передается, и он работает отлично.Я не могу понять, откуда данные поступают в объекте сообщения.Я погуглил, но не смог этого понять.Пожалуйста помоги.Заранее спасибо.

Код addGeneratedColumn

public void addGeneratedColumn(Object id, Function<BEANTYPE, ?> generatedColumn)
{
    String header = null;
    if(id instanceof String)
    {
        header = (String) id;
    }
    addGeneratedColumn(header, id, (source, itemId, columnId) -> generatedColumn.apply(itemId));
}

1 Ответ

0 голосов
/ 13 ноября 2018

this::createSubjectColumnForOutgoing является ссылкой на метод, а не на выполнение метода createSubjectColumnForOutgoing.

Метод table.addGeneratedColumn(), которому передается ссылка на метод, может вызывать метод функционального интерфейса.Реализовано по этому методу.Если это так, он передает экземпляр Message.

Вы не включили код addGeneratedColumn(), поэтому я не знаю, какой тип функционального интерфейса он ожидает (возможно, Function).

РЕДАКТИРОВАТЬ:

После вашего редактирования Function<BEANTYPE, ?> generatedColumn - это функциональный интерфейс, реализованный ссылкой на метод, которую вы передаете addGeneratedColumn().Это означает, что generatedColumn.apply(itemId) является оператором, выполняющим метод createSubjectColumnForOutgoing(), и вы можете видеть, что itemId передается методу.Это означает, что itemId должен быть экземпляром Message.

Обратите внимание, что addGeneratedColumn(Object id, Function<BEANTYPE, ?> generatedColumn) также не выполняет метод createSubjectColumnForOutgoing().Он передает функциональный интерфейс (реализованный с помощью лямбда-выражения), который может выполнять этот метод, во второй метод addGeneratedColumn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...